الفرق بين المراجعتين لصفحة: «Next.js/next server»
لا ملخص تعديل |
لا ملخص تعديل |
||
سطر 3: | سطر 3: | ||
== الكائن <code>NextRequest</code> == | == الكائن <code>NextRequest</code> == | ||
وهو امتداد للواجهة الأصلية <code>Request</code> | وهو امتداد للواجهة الأصلية <code>Request</code> بعد إضافة التوابع والخاصيات التالية: | ||
* <code>cookies</code>: قائمة مترابطة Map تضم ملفات تعريف الارتباط المأخوذة من الطلب <code>Request</code>. | * <code>cookies</code>: قائمة مترابطة Map تضم ملفات تعريف الارتباط المأخوذة من الطلب <code>Request</code>. | ||
* <code>nextUrl</code>: وتضم كائن موسّع ومُحلّل يمنحك الوصول إلى خاصيات | * <code>nextUrl</code>: وتضم كائن موسّع ومُحلّل يمنحك الوصول إلى خاصيات م<u>حددة في</u> مثل <code>pathname</code> و <code>basePath</code> و <code>trailingSlash</code> و <code>i18n</code>. بالإضافة إلى الخاصيات التالية: | ||
** <code>basePath</code>: من النوع (<code>string</code>) | **<code>basePath</code>: من النوع (<code>string</code>) | ||
** <code>buildId</code>: من النوع (<code>string || undefined</code>) | ** <code>buildId</code>: من النوع (<code>string || undefined</code>) | ||
** <code>defaultLocale</code>: من النوع (<code>string || undefined</code>) | ** <code>defaultLocale</code>: من النوع (<code>string || undefined</code>) | ||
سطر 25: | سطر 25: | ||
** <code>longitude</code>: من النوع (<code>string || undefined</code>). | ** <code>longitude</code>: من النوع (<code>string || undefined</code>). | ||
يمكنك استخدام الكائن <code>NextRequest</code> كبديل مباشر عن الواجهة الأصلية <code>Request</code> مما يمنحك تحكمًا أكبر | يمكنك استخدام الكائن <code>NextRequest</code> كبديل مباشر عن الواجهة الأصلية <code>Request</code> مما يمنحك تحكمًا أكبر بطريقة تعديل الطلب. يمكن إدراج <code>NextRequest</code> من المكوّن <code>next/server</code> كالتالي:<syntaxhighlight lang="javascript"> | ||
import type { NextRequest } from 'next/server' | import type { NextRequest } from 'next/server' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== الكائن <code>NextFetchEvent</code> == | == الكائن <code>NextFetchEvent</code> == | ||
يوسّع هذا الكائن الكائن الأصلي | يوسّع هذا الكائن الكائن الأصلي <code>[https://developer.mozilla.org/en-US/docs/Web/API/FetchEvent FetchEvent]</code> ويضم التابع <code>[https://developer.mozilla.org/en-US/docs/Web/API/ExtendableEvent/waitUntil ()waitUntil]</code>. يمكن استخدام التابع <code>()waitUntil</code> لإطالة وقت تنفيذ الدالة إن كانت هناك أعمال أخرى قيد التنفيذ في الخلفية.<syntaxhighlight lang="javascript"> | ||
import { NextResponse } from 'next/server' | import { NextResponse } from 'next/server' | ||
import type { NextFetchEvent, NextRequest } from 'next/server' | import type { NextFetchEvent, NextRequest } from 'next/server' | ||
سطر 44: | سطر 44: | ||
return NextResponse.next() | return NextResponse.next() | ||
} | } | ||
</syntaxhighlight>يمكن إدراج <code>NextFetchEvent</code> من المكوّن | </syntaxhighlight>يمكن إدراج <code>NextFetchEvent</code> من المكوّن <code>next/server</code> كالتالي:<syntaxhighlight lang="javascript"> | ||
import type { NextFetchEvent } from 'next/server' | import type { NextFetchEvent } from 'next/server' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 63: | سطر 63: | ||
* <code>()next</code>: يُعيد نسخة عن الصنف <code>NextResponse</code> تستأنف سلسلة الأداة الوسطية. | * <code>()next</code>: يُعيد نسخة عن الصنف <code>NextResponse</code> تستأنف سلسلة الأداة الوسطية. | ||
ولاستخدام التوابع السابقة، لا بد من | ولاستخدام التوابع السابقة، لا بد من إ<u>عادة الكائن</u> . يمكنك إدراج <code>NextResponse</code> من المكوّن <code>next/server</code> كالتالي:<syntaxhighlight lang="javascript"> | ||
import { NextResponse } from 'next/server' | import { NextResponse } from 'next/server' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
سطر 79: | سطر 79: | ||
** <code>vendor</code>: من النوع (<code>string || undefined</code>)، يُعيد مُصنّع لوحة الجهاز ويُحدَّد ديناميكيًا. | ** <code>vendor</code>: من النوع (<code>string || undefined</code>)، يُعيد مُصنّع لوحة الجهاز ويُحدَّد ديناميكيًا. | ||
* <code>engine</code>: ويضم: | * <code>engine</code>: ويضم: | ||
** <code>name</code>: (<code>string || undefined</code>) يحدد نوع المحرّك الذي بُني عليه المتصفح، ويأخذ أحد القيم التالية:<code>Amaya</code> أو <code>Blink</code> أو <code>EdgeHTML</code> أو <code>Flow</code> أو <code>Gecko</code> أو <code>Goanna</code> <code>iCab</code> أو <code>KHTML</code> <code>Links</code> أو <code>Lynx</code> أو <code>NetFront</code> أو <code>NetSurf</code> أو <code>Presto</code> أو <code>Tasman</code> أو <code>Trident</code> أو <code>w3m</code> أو <code>WebKit</code> أو <code>vendor</code> أو <code>undefined</code>. | **<code>name</code>: (<code>string || undefined</code>) يحدد نوع المحرّك الذي بُني عليه المتصفح، ويأخذ أحد القيم التالية:<code>Amaya</code> أو <code>Blink</code> أو <code>EdgeHTML</code> أو <code>Flow</code> أو <code>Gecko</code> أو <code>Goanna</code> <code>iCab</code> أو <code>KHTML</code> <code>Links</code> أو <code>Lynx</code> أو <code>NetFront</code> أو <code>NetSurf</code> أو <code>Presto</code> أو <code>Tasman</code> أو <code>Trident</code> أو <code>w3m</code> أو <code>WebKit</code> أو <code>vendor</code> أو <code>undefined</code>. | ||
** <code>version</code>:من النوع (<code>string || undefined</code>)، يعيد | ** <code>version</code>:من النوع (<code>string || undefined</code>)، يعيد إصدار محرّك المتصفح ويُحدَّد ديناميكيًا وقد يكون غير محدد <code>undefined</code>. | ||
* <code>os</code>: ويضم: | * <code>os</code>: ويضم: | ||
** <code>name</code>: من النوع (<code>string || undefined</code>)، يعيد اسم نظام التشغيل وقد يكون غير محدد <code>undefined</code>. | ** <code>name</code>: من النوع (<code>string || undefined</code>)، يعيد اسم نظام التشغيل وقد يكون غير محدد <code>undefined</code>. | ||
سطر 103: | سطر 103: | ||
=== لماذا يستخدم التابع <code>redirect</code> رمزي الحالة 307 و 308؟ === | === لماذا يستخدم التابع <code>redirect</code> رمزي الحالة 307 و 308؟ === | ||
قد تلاحظ استخدام رمز الحالة <code>307</code> لإعادة التوجه المؤقت و <code>308</code> لإعادة التوجه الدائم مع <code>()redirect</code>. وعلى الرغم من استخدام الرمزين | قد تلاحظ استخدام رمز الحالة <code>307</code> لإعادة التوجه المؤقت و <code>308</code> لإعادة التوجه الدائم مع <code>()redirect</code>. وعلى الرغم من استخدام الرمزين <code>302</code> و <code>301</code> على الترتيب تقليديًا، إلا أن العديد من المتصفحات قد غيرت نوع طلب إعادة التوجه من <code>POST</code> إلى <code>GET</code> عند استخدام الرمز <code>302</code> بغض النظر عن أصول نوع الطلب. | ||
فلو أخذنا المثال التالي عن إعادة التوجيه من <code>users/</code> إلى <code>people/</code>، ستجد أنك لو أجريت طلبًا من النوع <code>POST</code> إلى <code>users/</code> لإنشاء مستخدم جديد يتوافق مع رمز الحالة <code>302</code>، سيتغير نوع الطلب إلى <code>GET</code>، وهذا غير منطقي لأنك تحتاج إلى طلب من النوع <code>POST</code> إلى <code>people/</code> وليس من النوع <code>GET</code>. | فلو أخذنا المثال التالي عن إعادة التوجيه من <code>users/</code> إلى <code>people/</code>، ستجد أنك لو أجريت طلبًا من النوع <code>POST</code> إلى <code>users/</code> لإنشاء مستخدم جديد يتوافق مع رمز الحالة <code>302</code>، سيتغير نوع الطلب إلى <code>GET</code>، وهذا غير منطقي لأنك تحتاج إلى طلب من النوع <code>POST</code> إلى <code>people/</code> وليس من النوع <code>GET</code>. | ||
إنّ القصد من إدخال رمز الحالة هو الإشارة إلى أن نوع الطلب قد حُفظ كطلب <code>POST</code>. | |||
* <code>302</code>: ستغير عملية إعادة التوجيه المؤقت الطلب من <code>POST</code> إلى <code>GET</code>. | * <code>302</code>: ستغير عملية إعادة التوجيه المؤقت الطلب من <code>POST</code> إلى <code>GET</code>. | ||
* <code>307</code>: ستحفظ عملية إعادة التوجيه المؤقت الطلب على الشكل <code>POST</code>. | * <code>307</code>: ستحفظ عملية إعادة التوجيه المؤقت الطلب على الشكل <code>POST</code>. | ||
يستخدم التابع <code>()redirect</code> رمز الحالة <code>307</code> افتراضيًا بدلًا من <code>302</code>ويعني ذلك أن طلبك سيُحفظ دائمًا على أنه من النوع <code>POST</code>. وإن كنت تريد أن ترد | يستخدم التابع <code>()redirect</code> رمز الحالة <code>307</code> افتراضيًا بدلًا من <code>302</code>ويعني ذلك أن طلبك سيُحفظ دائمًا على أنه من النوع <code>POST</code>. وإن كنت تريد أن ترد باستجابة من النوع <code>GET</code> على طلب <code>POST</code> استخدم رمز الحالة <code>303</code>. | ||
=== كيف يمكنني الوصول إلى متغيرات الحالة؟ === | === كيف يمكنني الوصول إلى متغيرات الحالة؟ === |
مراجعة 03:40، 18 يوليو 2022
يقدّم المكوّن next/server
مجموعة من الدوال المساعدة تعمل على الخادم فقط وتستخدم مع الأداة الوسطية ووجهات API الحدودية
الكائن NextRequest
وهو امتداد للواجهة الأصلية Request
بعد إضافة التوابع والخاصيات التالية:
cookies
: قائمة مترابطة Map تضم ملفات تعريف الارتباط المأخوذة من الطلبRequest
.nextUrl
: وتضم كائن موسّع ومُحلّل يمنحك الوصول إلى خاصيات محددة في مثلpathname
وbasePath
وtrailingSlash
وi18n
. بالإضافة إلى الخاصيات التالية:basePath
: من النوع (string
)buildId
: من النوع (string || undefined
)defaultLocale
: من النوع (string || undefined
)domainLocale
:defaultLocale
: من النوع (string
)domain
: من النوع (string
)http
: من النوع (boolean || undefined
)locales
: من النوع (string[] || undefined
)locale
: من النوع (string || undefined
)url
: من النوع (URL
)
ip
: من النوع (string || undefined
) ويمتلك عنوان IP للطلب. وتزوّدك به منصة الاستضافة.geo
: وتضم معلومات عن الموقع الجغرافي من الطلبrequest
، وتتضمن هذه المعلومات التي تحصل عليها من منصة الاستضافة ما يلي:city
: من النوع (string || undefined
).country
: من النوع (string || undefined
).region
: من النوع (string || undefined
).latitude
: من النوع (string || undefined
).longitude
: من النوع (string || undefined
).
يمكنك استخدام الكائن NextRequest
كبديل مباشر عن الواجهة الأصلية Request
مما يمنحك تحكمًا أكبر بطريقة تعديل الطلب. يمكن إدراج NextRequest
من المكوّن next/server
كالتالي:
import type { NextRequest } from 'next/server'
الكائن NextFetchEvent
يوسّع هذا الكائن الكائن الأصلي FetchEvent
ويضم التابع ()waitUntil
. يمكن استخدام التابع ()waitUntil
لإطالة وقت تنفيذ الدالة إن كانت هناك أعمال أخرى قيد التنفيذ في الخلفية.
import { NextResponse } from 'next/server'
import type { NextFetchEvent, NextRequest } from 'next/server'
export async function middleware(req: NextRequest, event: NextFetchEvent) {
event.waitUntil(
fetch('https://my-analytics-platform.com', {
method: 'POST',
body: JSON.stringify({ pathname: req.nextUrl.pathname }),
})
)
return NextResponse.next()
}
يمكن إدراج NextFetchEvent
من المكوّن next/server
كالتالي:
import type { NextFetchEvent } from 'next/server'
الصنف NextResponse
يوسِّع هذا الصنف الواجهة الأصلية Response
من خلال التوابع والخاصيات التالية:
التوابع العامة
تُتاح هذه التوابع للاستعمال ضمن نسخ عن الصنف NextResponse
. إذ يمكنك إنتاج نسخ عن الصنف وفقًا لحالة الاستخدام وإسنادها إلى متغير ثم الوصول من خلاله إلى التوابع العامة التالية:
cookies
: قائمة مترابطة Map تضم ملفات تعريف الارتباط المأخوذة من الطلبRequest
.
التوابع الساكنة
إليك التوابع الساكنة المتاحة للاستخدام المباشر من خلال NextResponse
:
()redirect
: يُعيد نسخة عن الصنفNextResponse
مع مجموعة إعادة توجيه.()rewrite
: يُعيد نسخة عن الصنفNextResponse
مع مجموعة إعادة كتابة.()next
: يُعيد نسخة عن الصنفNextResponse
تستأنف سلسلة الأداة الوسطية.
ولاستخدام التوابع السابقة، لا بد من إعادة الكائن . يمكنك إدراج NextResponse
من المكوّن next/server
كالتالي:
import { NextResponse } from 'next/server'
الدالة المساعدة userAgent
تسمح هذه الدالة بالتفاعل مع كائن عميل المستخدم user agent القادم مع الطلب. أخذت الدالة من الكائن الأصلي Request
وهي ميزة مخصصة لها الخاصيات التالية:
isBot
: من النوع (boolean
) وتحدد إن كان مصدر الطلب برنامج آلي bot معروف.browser
: ويضم:name
: من النوع (string || undefined
)، يعيد اسم المتصفح.version
: من النوع (string || undefined
)، يعيد إصدار المتصفح ويُحدد ديناميكيًا.
device
: ويضم:model
: من النوع (string || undefined
)، يعيد نوع الجهاز ويُحدد ديناميكيًا.type
: من النوع (string || undefined
)، يعيد نوع المتصفح، ويمكن أن يحمل إحدى القيم التاليةconsole
أوmobile
أوtablet
أوsmarttv
أوwearable
أوembedded
أوundefined
.vendor
: من النوع (string || undefined
)، يُعيد مُصنّع لوحة الجهاز ويُحدَّد ديناميكيًا.
engine
: ويضم:name
: (string || undefined
) يحدد نوع المحرّك الذي بُني عليه المتصفح، ويأخذ أحد القيم التالية:Amaya
أوBlink
أوEdgeHTML
أوFlow
أوGecko
أوGoanna
iCab
أوKHTML
Links
أوLynx
أوNetFront
أوNetSurf
أوPresto
أوTasman
أوTrident
أوw3m
أوWebKit
أوvendor
أوundefined
.version
:من النوع (string || undefined
)، يعيد إصدار محرّك المتصفح ويُحدَّد ديناميكيًا وقد يكون غير محددundefined
.
os
: ويضم:name
: من النوع (string || undefined
)، يعيد اسم نظام التشغيل وقد يكون غير محددundefined
.version
: من النوع (string || undefined
)، ويعيد إصدار نظام التشغيل، وقد يكون غير محددundefined
.
cpu
: ويضم:architecture
: من النوع (string || undefined
)، يعيد معمارية المعالج، ويأخذ احد القيم التالية:68k
أوamd64
أوarm
أوarm64
أوarmhf
أوavr
أوia32
أوia64
أوirix
أوirix64
أوmips
أوmips64
أوpa-risc
أوppc
أوsparc
أوsparc64
أو غير محددundefined
.
يمكنك إدراج userAgent
من المكوّن next/server
كالتالي:
import { userAgent } from 'next/server'
import { NextRequest, NextResponse, userAgent } from 'next/server'
export function middleware(request: NextRequest) {
const url = request.nextUrl
const { device } = userAgent(request)
const viewport = device.type === 'mobile' ? 'mobile' : 'desktop'
url.searchParams.set('viewport', viewport)
return NextResponse.rewrite(url)
}
الأسئلة الأكثر شيوعًا
لماذا يستخدم التابع redirect
رمزي الحالة 307 و 308؟
قد تلاحظ استخدام رمز الحالة 307
لإعادة التوجه المؤقت و 308
لإعادة التوجه الدائم مع ()redirect
. وعلى الرغم من استخدام الرمزين 302
و 301
على الترتيب تقليديًا، إلا أن العديد من المتصفحات قد غيرت نوع طلب إعادة التوجه من POST
إلى GET
عند استخدام الرمز 302
بغض النظر عن أصول نوع الطلب.
فلو أخذنا المثال التالي عن إعادة التوجيه من users/
إلى people/
، ستجد أنك لو أجريت طلبًا من النوع POST
إلى users/
لإنشاء مستخدم جديد يتوافق مع رمز الحالة 302
، سيتغير نوع الطلب إلى GET
، وهذا غير منطقي لأنك تحتاج إلى طلب من النوع POST
إلى people/
وليس من النوع GET
.
إنّ القصد من إدخال رمز الحالة هو الإشارة إلى أن نوع الطلب قد حُفظ كطلب POST
.
302
: ستغير عملية إعادة التوجيه المؤقت الطلب منPOST
إلىGET
.307
: ستحفظ عملية إعادة التوجيه المؤقت الطلب على الشكلPOST
.
يستخدم التابع ()redirect
رمز الحالة 307
افتراضيًا بدلًا من 302
ويعني ذلك أن طلبك سيُحفظ دائمًا على أنه من النوع POST
. وإن كنت تريد أن ترد باستجابة من النوع GET
على طلب POST
استخدم رمز الحالة 303
.
كيف يمكنني الوصول إلى متغيرات الحالة؟
بإمكانك استخدام الملف process.env
للوصول إلى متغيرات البيئة من الأداة الوسطية الحدودية وسيجري التحقق من المتغيرات أثناء تنفيذ الأمر next build
:
الشيفرة التالية قابلة للتنفيذ | الشيفرة التالية غير قابلة للتنفيذ |
---|---|
console.log(process.env.MY_ENV_VARIABLE)
|
const getEnv = name => process.env[name]
|
const { MY_ENV_VARIABLE } = process.env
|
الشيفرة التالية غير قابلة للتنفيذ |
const { "MY-ENV-VARIABLE": MY_ENV_VARIABLE } = process.env
|
اقرأ أيضًا
المصادر
- الصفحة Next/server من توثيق Next.js الرسمي.