الفرق بين المراجعتين لصفحة: «Next.js/next server»

من موسوعة حسوب
لا ملخص تعديل
طلا ملخص تعديل
 
(4 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:الواجهة البرمجية للمكوّن next/server في Next.js}}</noinclude>
<noinclude>{{DISPLAYTITLE:الواجهة البرمجية للمكوّن next/server في Next.js}}</noinclude>
يقدّم المكوّن <code>next/server</code> مجموعة من الدوال المساعدة تعمل على الخادم فقط وتستخدم مع [[Next.js/middleware|الأداة الوسطية]] و<nowiki/>[[Next.js/api routes|وجهات API الحدودية]]  
يقدّم المكوّن <code>next/server</code> مجموعة من دوال مساعدة تعمل على الخادم فقط وتستخدم مع [[Next.js/middleware|البرمجيات الوسطية]] و<nowiki/>[[Next.js/edge api routes|وجهات API المتقدمة]].


== الكائن <code>NextRequest</code> ==
== الكائن <code>NextRequest</code> ==
وهو امتداد للواجهة الأصلية <code>Request</code> بعد إضافة التوابع والخاصيات التالية:
وهو امتداد للواجهة الأصلية <code>[https://developer.mozilla.org/en-US/docs/Web/API/Request Request]</code> بعد إضافة التوابع والخاصيات التالية:


* <code>cookies</code>: قائمة مترابطة Map تضم ملفات تعريف الارتباط المأخوذة من الطلب <code>Request</code>.
* <code>cookies</code>: نسخة من [https://edge-runtime.vercel.app/packages/cookies#for-request RequestCookies] تضم ملفات تعريف الارتباط المأخوذة من الطلب <code>Request</code> وهي تقرأ وتُعدل الترويسة Cookie للطلب، انظر [[Next.js/middleware|استخدام ملفات تعريف الارتباط في البرمجيات الوسيطة]]:
** <code>get</code>: تابع يعيد عنصر من ملف تعريف الارتباط المسمى باسم <code>name</code> المعطى له ويعيد كائنًا بالاسم والقيمة الموجودة أو القيمة <code>undefined</code> إن لم يكن لها قيمة، أما إن كان هنالك عدة قيم، فسيعيد القيمة الأولى منها.
** <code>getAll</code>: تابع يشبه التابع السابق باستثناء أنه يعيد قائمة بكل قيم عنصر ملف تعريف الارتباط المسمى باسم <code>name</code> المُعطى له، أو سيعيد كل عناصر ملف تعريف الارتباط إن لم يُعطى أي اسم له.
** <code>set</code>: تابع يضبط عنصر ملف تعريف الارتباط ويأخذ كائن <code>CookieListItem</code> المُعرف في مواصفة واجهة [https://wicg.github.io/cookie-store/#dictdef-cookielistitem W3C CookieStore].
** <code>delete</code>: تابع يأخذ إما اسم <code>name</code> أو قائمة بعدة أسماء يراد حذفها من عناصر ملف تعريف الارتباط ثم يعيد القيمة <code>true</code> إن جرت عملية الحذف بنجاح أو القيمة <code>false</code> خلاف ذلك.
** <code>has</code>: تابع يأخذ اسم <code>name</code> لعنصر ملف تعريف ارتباط يراد التأكد من وجوده ويعيد <code>true</code> إن كان موجودًا أو <code>false</code> خلاف ذلك.
** <code>clear</code>: تابع يؤدي استدعاؤه إلى حذف الترويسة Cookie.
* <code>nextUrl</code>: وتضم كائن موسّع ومُحلّل يمنحك الوصول إلى خاصيات م<u>حددة في</u> مثل <code>pathname</code> و <code>basePath</code> و <code>trailingSlash</code> و <code>i18n</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>)  
** <code>domainLocale</code> :
** <code>domainLocale</code>:
*** <code>defaultLocale</code>: من النوع (<code>string</code>)
***<code>defaultLocale</code>: من النوع (<code>string</code>)
*** <code>domain</code>: من النوع (<code>string</code>)
*** <code>domain</code>: من النوع (<code>string</code>)
*** <code>http</code>: من النوع (<code>boolean || undefined</code>)
*** <code>http</code>: من النوع (<code>boolean || undefined</code>)
*** <code>locales</code>: من النوع (<code>string[] || undefined</code>)
*** <code>locales</code>: من النوع (<code>string[] || undefined</code>)
*** <code>locale</code>: من النوع (<code>string || undefined</code>)
**<code>locale</code>: من النوع (<code>string || undefined</code>)
*** <code>url</code> : من النوع (<code>URL</code>)
**<code>url</code>: من النوع (<code>URL</code>)
* <code>ip</code>: من النوع (<code>string || undefined</code>) ويمتلك عنوان IP للطلب. وتزوّدك به منصة الاستضافة.
* <code>ip</code>: من النوع (<code>string || undefined</code>) ويمتلك عنوان IP للطلب. وتزوّدك به منصة الاستضافة.
* <code>geo</code>: وتضم معلومات عن الموقع الجغرافي من الطلب <code>request</code>، وتتضمن هذه المعلومات التي تحصل عليها من منصة الاستضافة ما يلي:
* <code>geo</code>: وتضم معلومات عن الموقع الجغرافي من الطلب <code>request</code>، وتتضمن هذه المعلومات التي تحصل عليها من منصة الاستضافة ما يلي:
** <code>city</code> : من النوع (<code>string || undefined</code>).
**<code>city</code>: من النوع (<code>string || undefined</code>).
** <code>country</code>: من النوع (<code>string || undefined</code>).
** <code>country</code>: من النوع (<code>string || undefined</code>).
** <code>region</code>: من النوع (<code>string || undefined</code>).
** <code>region</code>: من النوع (<code>string || undefined</code>).
** <code>latitude</code>: من النوع (<code>string || undefined</code>).
** <code>latitude</code>: من النوع (<code>string || undefined</code>).
** <code>longitude</code>: من النوع (<code>string || undefined</code>).
** <code>longitude</code>: من النوع (<code>string || undefined</code>).


يمكنك استخدام الكائن <code>NextRequest</code> كبديل مباشر عن الواجهة الأصلية <code>Request</code> مما يمنحك تحكمًا أكبر بطريقة تعديل الطلب. يمكن إدراج <code>NextRequest</code> من المكوّن <code>next/server</code> كالتالي:<syntaxhighlight lang="javascript">
يمكنك استخدام الكائن <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>
سطر 34: سطر 40:
import type { NextFetchEvent, NextRequest } from 'next/server'
import type { NextFetchEvent, NextRequest } from 'next/server'


export async function middleware(req: NextRequest, event: NextFetchEvent) {
export function middleware(req: NextRequest, event: NextFetchEvent) {
   event.waitUntil(
   event.waitUntil(
     fetch('https://my-analytics-platform.com', {
     fetch('https://my-analytics-platform.com', {
سطر 54: سطر 60:
تُتاح هذه التوابع للاستعمال ضمن نسخ عن الصنف <code>NextResponse</code>. إذ يمكنك إنتاج نسخ عن الصنف وفقًا لحالة الاستخدام وإسنادها إلى متغير ثم الوصول من خلاله إلى التوابع العامة التالية:
تُتاح هذه التوابع للاستعمال ضمن نسخ عن الصنف <code>NextResponse</code>. إذ يمكنك إنتاج نسخ عن الصنف وفقًا لحالة الاستخدام وإسنادها إلى متغير ثم الوصول من خلاله إلى التوابع العامة التالية:


* <code>cookies</code>: قائمة مترابطة Map تضم ملفات تعريف الارتباط المأخوذة من الطلب <code>Request</code>.
* <code>cookies</code>: نسخة من [https://edge-runtime.vercel.app/packages/cookies#for-request RequestCookies] تضم ملفات تعريف الارتباط المأخوذة من الطلب <code>Request</code> وهي تقرأ وتُعدل الترويسة Set-Cookie للرد، انظر [[Next.js/middleware|استخدام ملفات تعريف الارتباط في البرمجيات الوسيطة]]:
** <code>get</code>: تابع يعيد عنصر من ملف تعريف الارتباط المسمى باسم <code>name</code> المعطى له ويعيد كائنًا بالاسم والقيمة الموجودة أو القيمة <code>undefined</code> إن لم يكن لها قيمة، أما إن كان هنالك عدة قيم، فسيعيد القيمة الأولى منها.
** <code>getAll</code>: تابع يشبه التابع السابق باستثناء أنه يعيد قائمة بكل قيم عنصر ملف تعريف الارتباط المسمى باسم <code>name</code> المُعطى له، أو سيعيد كل عناصر ملف تعريف الارتباط إن لم يُعطى أي اسم له.
** <code>set</code>: تابع يضبط عنصر ملف تعريف الارتباط ويأخذ كائن <code>CookieListItem</code> المُعرف في مواصفة واجهة [https://wicg.github.io/cookie-store/#dictdef-cookielistitem W3C CookieStore].
** <code>delete</code>: تابع يأخذ إما اسم <code>name</code> أو قائمة بعدة أسماء يراد حذفها من عناصر ملف تعريف الارتباط ثم يعيد القيمة <code>true</code> إن جرت عملية الحذف بنجاح أو القيمة <code>false</code> خلاف ذلك.
** <code>has</code>: تابع يأخذ اسم <code>name</code> لعنصر ملف تعريف ارتباط يراد التأكد من وجوده ويعيد <code>true</code> إن كان موجودًا أو <code>false</code> خلاف ذلك.
** <code>clear</code>: تابع يؤدي استدعاؤه إلى حذف الترويسة Cookie.


=== التوابع الساكنة ===
=== التوابع الساكنة ===
سطر 63: سطر 75:
* <code>()next</code>: يُعيد نسخة عن الصنف <code>NextResponse</code> تستأنف سلسلة الأداة الوسطية.
* <code>()next</code>: يُعيد نسخة عن الصنف <code>NextResponse</code> تستأنف سلسلة الأداة الوسطية.


ولاستخدام التوابع السابقة، لا بد من إ<u>عادة الكائن</u> . يمكنك إدراج <code>NextResponse</code> من المكوّن <code>next/server</code> كالتالي:<syntaxhighlight lang="javascript">
ولاستخدام التوابع السابقة، لا بد من إعادة الكائن <code>NextResponse</code>. يمكنك إدراج <code>NextResponse</code> من المكوّن <code>next/server</code> كالتالي:<syntaxhighlight lang="javascript">
import { NextResponse } from 'next/server'
import { NextResponse } from 'next/server'
</syntaxhighlight>
</syntaxhighlight>
سطر 75: سطر 87:
** <code>version</code>: من النوع (<code>string || undefined</code>)، يعيد إصدار المتصفح ويُحدد ديناميكيًا.
** <code>version</code>: من النوع (<code>string || undefined</code>)، يعيد إصدار المتصفح ويُحدد ديناميكيًا.
* <code>device</code>: ويضم:
* <code>device</code>: ويضم:
** <code>model</code>: من النوع (<code>string || undefined</code>)، يعيد نوع الجهاز ويُحدد ديناميكيًا.
**<code>model</code>: من النوع (<code>string || undefined</code>)، يعيد نوع الجهاز ويُحدد ديناميكيًا.
** <code>type</code>: من النوع (<code>string || undefined</code>)، يعيد نوع المتصفح، ويمكن أن يحمل إحدى القيم التالية <code>console</code> أو <code>mobile</code> أو <code>tablet</code> أو <code>smarttv</code> أو <code>wearable</code> أو <code>embedded</code> أو <code>undefined</code>.
** <code>type</code>: من النوع (<code>string || undefined</code>)، يعيد نوع المتصفح، ويمكن أن يحمل إحدى القيم التالية <code>console</code> أو <code>mobile</code> أو <code>tablet</code> أو <code>smarttv</code> أو <code>wearable</code> أو <code>embedded</code> أو <code>undefined</code>.
** <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>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>.
** <code>version</code>: من النوع (<code>string || undefined</code>)، ويعيد إصدار نظام التشغيل، وقد يكون غير محدد <code>undefined</code>.
** <code>version</code>: من النوع (<code>string || undefined</code>)، ويعيد إصدار نظام التشغيل، وقد يكون غير محدد <code>undefined</code>.
* <code>cpu</code>: ويضم:
* <code>cpu</code>: ويضم:
** <code>architecture</code>: من النوع (<code>string || undefined</code>)، يعيد معمارية المعالج، ويأخذ احد القيم التالية: <code>68k</code> أو <code>amd64</code> أو <code>arm</code> أو <code>arm64</code> أو <code>armhf</code> أو <code>avr</code> أو <code>ia32</code> أو <code>ia64</code> أو <code>irix</code> أو <code>irix64</code> أو <code>mips</code> أو <code>mips64</code> أو <code>pa-risc</code> أو <code>ppc</code> أو <code>sparc</code> أو <code>sparc64</code> أو غير محدد <code>undefined</code>.
**<code>architecture</code>: من النوع (<code>string || undefined</code>)، يعيد معمارية المعالج، ويأخذ احد القيم التالية: <code>68k</code> أو <code>amd64</code> أو <code>arm</code> أو <code>arm64</code> أو <code>armhf</code> أو <code>avr</code> أو <code>ia32</code> أو <code>ia64</code> أو <code>irix</code> أو <code>irix64</code> أو <code>mips</code> أو <code>mips64</code> أو <code>pa-risc</code> أو <code>ppc</code> أو <code>sparc</code> أو <code>sparc64</code> أو غير محدد <code>undefined</code>.


يمكنك إدراج <code>userAgent</code> من المكوّن <code>next/server</code> كالتالي:<syntaxhighlight lang="javascript">
يمكنك إدراج <code>userAgent</code> من المكوّن <code>next/server</code> كالتالي:<syntaxhighlight lang="javascript">
سطر 102: سطر 114:
== الأسئلة الأكثر شيوعًا ==
== الأسئلة الأكثر شيوعًا ==


=== لماذا يستخدم التابع <code>redirect</code> رمزي الحالة 307 و 308؟ ===
=== لماذا يستخدم التابع <code>redirect</code> رمزي الحالة 307 و308؟ ===
قد تلاحظ استخدام رمز الحالة <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>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>.
سطر 112: سطر 124:
* <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>GET</code> على طلب <code>POST</code> استخدم رمز الحالة <code>303</code>.
يستخدم التابع <code>()redirect</code> رمز الحالة <code>307</code> افتراضيًا بدلًا من <code>302</code>ويعني ذلك أن طلبك سيُحفظ دائمًا على أنه من النوع <code>POST</code>. وإن كنت تريد أن ترد باستجابة من النوع <code>GET</code> على طلب <code>POST</code> استخدم رمز الحالة <code>303</code>.


=== كيف يمكنني الوصول إلى متغيرات الحالة؟ ===
=== كيف يمكنني الوصول إلى متغيرات البيئة؟ ===
بإمكانك استخدام الملف <code>process.env</code> للوصول إلى [[Next.js/environment variables|متغيرات البيئة]] من الأداة الوسطية الحدودية وسيجري التحقق من المتغيرات أثناء تنفيذ الأمر <code>next build</code>:
بإمكانك استخدام الملف <code>process.env</code> للوصول إلى [[Next.js/environment variables|متغيرات البيئة]] من الأداة الوسطية الحدودية وسيجري التحقق من المتغيرات أثناء تنفيذ الأمر <code>next build</code>:
{| class="wikitable"
{| class="wikitable"
|+
!الشيفرة التالية قابلة للتنفيذ
!الشيفرة التالية قابلة للتنفيذ
!الشيفرة التالية غير قابلة للتنفيذ
!الشيفرة التالية غير قابلة للتنفيذ
سطر 125: سطر 136:
|-
|-
|<code>const { MY_ENV_VARIABLE } = process.env</code>
|<code>const { MY_ENV_VARIABLE } = process.env</code>
|<span class="td-span"><span class="md-plain">الشيفرة التالية غير قابلة للتنفيذ</span></span>
|
|-
|-
|<code>const { "MY-ENV-VARIABLE": MY_ENV_VARIABLE } = process.env</code>
|<code>const { "MY-ENV-VARIABLE": MY_ENV_VARIABLE } = process.env</code>
|<span class="td-span md-focus"><span class="md-plain md-expand">الشيفرة التالية قابلة للتنفيذ</span></span>
|
|}
|}


سطر 138: سطر 149:


* الصفحة [https://nextjs.org/docs/api-reference/next/server Next/server] من توثيق Next.js الرسمي.
* الصفحة [https://nextjs.org/docs/api-reference/next/server Next/server] من توثيق Next.js الرسمي.
[[تصنيف:Next.js|{{SUBPAGENAME}}]]
[[تصنيف:Next.js API|{{SUBPAGENAME}}]]

المراجعة الحالية بتاريخ 19:58، 4 يناير 2023

يقدّم المكوّن next/server مجموعة من دوال مساعدة تعمل على الخادم فقط وتستخدم مع البرمجيات الوسطية ووجهات API المتقدمة.

الكائن NextRequest

وهو امتداد للواجهة الأصلية Request بعد إضافة التوابع والخاصيات التالية:

  • cookies: نسخة من RequestCookies تضم ملفات تعريف الارتباط المأخوذة من الطلب Request وهي تقرأ وتُعدل الترويسة Cookie للطلب، انظر استخدام ملفات تعريف الارتباط في البرمجيات الوسيطة:
    • get: تابع يعيد عنصر من ملف تعريف الارتباط المسمى باسم name المعطى له ويعيد كائنًا بالاسم والقيمة الموجودة أو القيمة undefined إن لم يكن لها قيمة، أما إن كان هنالك عدة قيم، فسيعيد القيمة الأولى منها.
    • getAll: تابع يشبه التابع السابق باستثناء أنه يعيد قائمة بكل قيم عنصر ملف تعريف الارتباط المسمى باسم name المُعطى له، أو سيعيد كل عناصر ملف تعريف الارتباط إن لم يُعطى أي اسم له.
    • set: تابع يضبط عنصر ملف تعريف الارتباط ويأخذ كائن CookieListItem المُعرف في مواصفة واجهة W3C CookieStore.
    • delete: تابع يأخذ إما اسم name أو قائمة بعدة أسماء يراد حذفها من عناصر ملف تعريف الارتباط ثم يعيد القيمة true إن جرت عملية الحذف بنجاح أو القيمة false خلاف ذلك.
    • has: تابع يأخذ اسم name لعنصر ملف تعريف ارتباط يراد التأكد من وجوده ويعيد true إن كان موجودًا أو false خلاف ذلك.
    • clear: تابع يؤدي استدعاؤه إلى حذف الترويسة Cookie.
  • 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 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: نسخة من RequestCookies تضم ملفات تعريف الارتباط المأخوذة من الطلب Request وهي تقرأ وتُعدل الترويسة Set-Cookie للرد، انظر استخدام ملفات تعريف الارتباط في البرمجيات الوسيطة:
    • get: تابع يعيد عنصر من ملف تعريف الارتباط المسمى باسم name المعطى له ويعيد كائنًا بالاسم والقيمة الموجودة أو القيمة undefined إن لم يكن لها قيمة، أما إن كان هنالك عدة قيم، فسيعيد القيمة الأولى منها.
    • getAll: تابع يشبه التابع السابق باستثناء أنه يعيد قائمة بكل قيم عنصر ملف تعريف الارتباط المسمى باسم name المُعطى له، أو سيعيد كل عناصر ملف تعريف الارتباط إن لم يُعطى أي اسم له.
    • set: تابع يضبط عنصر ملف تعريف الارتباط ويأخذ كائن CookieListItem المُعرف في مواصفة واجهة W3C CookieStore.
    • delete: تابع يأخذ إما اسم name أو قائمة بعدة أسماء يراد حذفها من عناصر ملف تعريف الارتباط ثم يعيد القيمة true إن جرت عملية الحذف بنجاح أو القيمة false خلاف ذلك.
    • has: تابع يأخذ اسم name لعنصر ملف تعريف ارتباط يراد التأكد من وجوده ويعيد true إن كان موجودًا أو false خلاف ذلك.
    • clear: تابع يؤدي استدعاؤه إلى حذف الترويسة Cookie.

التوابع الساكنة

إليك التوابع الساكنة المتاحة للاستخدام المباشر من خلال NextResponse:

  • ()redirect: يُعيد نسخة عن الصنف NextResponse مع مجموعة إعادة توجيه.
  • ()rewrite: يُعيد نسخة عن الصنف NextResponse مع مجموعة إعادة كتابة.
  • ()next: يُعيد نسخة عن الصنف NextResponse تستأنف سلسلة الأداة الوسطية.

ولاستخدام التوابع السابقة، لا بد من إعادة الكائن 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 الرسمي.