NextRequest و NextResponse
يوفر next/server
أدوات مساعدة خاصة بالخادم للاستخدام في البرمجيات الوسيطة (Middleware) ومسارات واجهة برمجة التطبيقات الحافة (Edge API Routes).
NextRequest
كائن NextRequest
هو امتداد لواجهة Request
الأصلية، مع إضافة الطرق والخصائص التالية:
-
cookies
- نسخة من RequestCookies تحتوي على ملفات تعريف الارتباط منRequest
. تقرأ/تعدل رأسCookie
للطلب. انظر أيضًا استخدام ملفات تعريف الارتباط في البرمجيات الوسيطة (Middleware).get
- طريقة تأخذ اسم ملف تعريف الارتباطname
وتُرجع كائنًا يحتوي علىname
وvalue
. إذا لم يتم العثور على ملف تعريف الارتباط، تُرجعundefined
. إذا تطابق أكثر من ملف تعريف، تُرجع أول تطابق فقط.getAll
- طريقة مشابهة لـget
، ولكنها تُرجع قائمة بجميع ملفات تعريف الارتباط المتطابقة معname
. إذا لم يتم تحديدname
، تُرجع جميع ملفات تعريف الارتباط المتاحة.set
- طريقة تأخذ كائنًا بخصائصCookieListItem
كما هو محدد في مواصفات W3C CookieStore API.delete
- طريقة تأخذ اسم ملف تعريف الارتباطname
أو قائمة أسماء وتزيل ملفات تعريف الارتباط المتطابقة. تُرجعtrue
للملفات المحذوفة وfalse
للملفات غير المحذوفة.has
- طريقة تأخذ اسم ملف تعريف الارتباطname
وتُرجع قيمةboolean
بناءً على وجود الملف (true
) أو عدم وجوده (false
).clear
- طريقة لا تأخذ أي وسيطات وتزيل رأسCookie
بشكل فعال.
-
nextUrl
: يتضمن كائن URL ممتدًا ومحللاً يمنحك الوصول إلى خصائص Next.js الخاصة مثل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 لـRequest
. توفر هذه المعلومات منصة الاستضافة الخاصة بك. -
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
يمتد كائن 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
توسع فئة NextResponse
واجهة Response
الأصلية، بما يلي:
الطرق العامة
الطرق العامة متاحة على نسخة من فئة NextResponse
. اعتمادًا على حالة الاستخدام، يمكنك إنشاء نسخة وتعيينها لمتغير، ثم الوصول إلى الطرق العامة التالية:
cookies
- نسخة من ResponseCookies تحتوي على ملفات تعريف الارتباط منResponse
. تقرأ/تعدل رأسSet-Cookie
للاستجابة. انظر أيضًا استخدام ملفات تعريف الارتباط في البرمجيات الوسيطة (Middleware).get
- طريقة تأخذ اسم ملف تعريف الارتباطname
وتُرجع كائنًا يحتوي علىname
وvalue
. إذا لم يتم العثور على ملف تعريف الارتباط، تُرجعundefined
. إذا تطابق أكثر من ملف تعريف، تُرجع أول تطابق فقط.getAll
- طريقة مشابهة لـget
، ولكنها تُرجع قائمة بجميع ملفات تعريف الارتباط المتطابقة معname
. إذا لم يتم تحديدname
، تُرجع جميع ملفات تعريف الارتباط المتاحة.set
- طريقة تأخذ كائنًا بخصائصCookieListItem
كما هو محدد في مواصفات W3C CookieStore API.delete
- طريقة تأخذ اسم ملف تعريف الارتباطname
أو قائمة أسماء وتزيل ملفات تعريف الارتباط المتطابقة. تُرجعtrue
للملفات المحذوفة وfalse
للملفات غير المحذوفة.
الطرق الثابتة
الطرق الثابتة التالية متاحة مباشرة على فئة NextResponse
:
redirect()
- تُرجعNextResponse
مع إعادة توجيه مضبوطةrewrite()
- تُرجعNextResponse
مع إعادة كتابة مضبوطةnext()
- تُرجعNextResponse
التي ستستمر في سلسلة البرمجيات الوسيطة
لاستخدام الطرق أعلاه، يجب عليك إرجاع كائن NextResponse
المُعاد. يمكن استيراد NextResponse
من next/server
:
import { NextResponse } from 'next/server'
userAgent
يسمح لك مساعد userAgent
بالتفاعل مع كائن وكيل المستخدم من الطلب. وهو مجرد من كائن Request
الأصلي، وميزة اختيارية. يحتوي على الخصائص التالية:
isBot
: (boolean
) ما إذا كان الطلب يأتي من بوت معروف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
أو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؟
عند استخدام redirect()
قد تلاحظ أن رموز الحالة المستخدمة هي 307
لإعادة التوجيه المؤقتة، و308
لإعادة التوجيه الدائمة. بينما تقليديًا كان يتم استخدام 302
لإعادة التوجيه المؤقتة، و301
لإعادة التوجيه الدائمة، قامت العديد من المتصفحات بتغيير طريقة طلب إعادة التوجيه من POST
إلى GET
عند استخدام 302
، بغض النظر عن طريقة الطلب الأصلية.
خذ المثال التالي لإعادة التوجيه من /users
إلى /people
، إذا قمت بطلب POST
إلى /users
لإنشاء مستخدم جديد، وكنت تتبع إعادة توجيه مؤقتة 302
، سيتم تغيير طريقة الطلب من POST
إلى GET
. هذا غير منطقي، لأنه لإنشاء مستخدم جديد، يجب عليك تقديم طلب POST
إلى /people
، وليس طلب GET
.
أدخل رمز الحالة 307
يعني الحفاظ على طريقة الطلب كـ POST
.
302
- إعادة توجيه مؤقتة، ستغير طريقة الطلب منPOST
إلىGET
307
- إعادة توجيه مؤقتة، ستحافظ على طريقة الطلب كـPOST
تستخدم طريقة redirect()
رمز 307
افتراضيًا، بدلاً من إعادة التوجيه المؤقتة 302
، مما يعني أن طلباتك ستظل دائمًا POST
.
إذا كنت تريد إحداث استجابة GET
لطلب POST
، استخدم 303
.
تعلم المزيد حول إعادة التوجيه HTTP.
كيف يمكنني الوصول إلى متغيرات البيئة؟
يمكن استخدام process.env
للوصول إلى متغيرات البيئة من البرمجيات الوسيطة الحافة (Edge Middleware). يتم تقييمها أثناء 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 |