NextRequest と NextResponse
next/server は、ミドルウェア と エッジAPIルート で使用するサーバー専用ヘルパーを提供します。
NextRequest
NextRequest オブジェクトは、ネイティブの Request インターフェースを拡張したもので、以下の追加メソッドとプロパティを持ちます:
-
cookies- リクエストから取得したクッキーを含む RequestCookies インスタンス。リクエストのCookieヘッダーを読み取り/変更します。ミドルウェアでのクッキー使用 も参照してください。get- クッキーのnameを受け取り、nameとvalueを含むオブジェクトを返すメソッド。nameのクッキーが見つからない場合はundefinedを返します。複数のクッキーが一致する場合、最初の一致のみを返します。getAll-getと似ていますが、一致するnameのすべてのクッキーのリストを返します。nameが指定されていない場合は、利用可能なすべてのクッキーを返します。set- W3C CookieStore API 仕様で定義されているCookieListItemのプロパティを持つオブジェクトを受け取るメソッド。delete- クッキーのnameまたは名前のリストを受け取り、一致する名前のクッキーを削除します。削除された場合はtrue、削除されなかった場合はfalseを返します。has- クッキーのnameを受け取り、クッキーが存在するかどうかに基づいてbooleanを返します(存在する場合はtrue、存在しない場合はfalse)。clear- 引数を取らず、Cookieヘッダーを効果的に削除します。
-
nextUrl:pathname、basePath、trailingSlash、i18nなどのNext.js固有のプロパティにアクセスできる拡張された解析済みURLオブジェクトを含みます。以下のプロパティを含みます:basePath(string)buildId(string || undefined)defaultLocale(string || undefined)domainLocaledefaultLocale: (string)domain: (string)http: (boolean || undefined)locales: (string[] || undefined)
locale(string || undefined)url(URL)
-
ip: (string || undefined) - リクエストのIPアドレスを含みます。この情報はホスティングプラットフォームによって提供されます。 -
geo- リクエストの地理的位置情報を含みます。この情報はホスティングプラットフォームによって提供されます。以下のプロパティを含みます: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 インスタンス。レスポンスのSet-Cookieヘッダーを読み取り/変更します。ミドルウェアでのクッキー使用 も参照してください。get- クッキーのnameを受け取り、nameとvalueを含むオブジェクトを返すメソッド。nameのクッキーが見つからない場合はundefinedを返します。複数のクッキーが一致する場合、最初の一致のみを返します。getAll-getと似ていますが、一致するnameのすべてのクッキーのリストを返します。nameが指定されていない場合は、利用可能なすべてのクッキーを返します。set- W3C CookieStore API 仕様で定義されているCookieListItemのプロパティを持つオブジェクトを受け取るメソッド。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) リクエストが既知のボットからのものかどうかbrowsername: (string || undefined) ブラウザの名前version: (string || undefined) 動的に決定されるブラウザのバージョン
devicemodel: (string || undefined) 動的に決定されるデバイスのモデルtype: (string || undefined) ブラウザのタイプで、以下のいずれかの値:console、mobile、tablet、smarttv、wearable、embedded、またはundefinedvendor: (string || undefined) 動的に決定されるデバイスのベンダー
enginename: (string || undefined) ブラウザエンジンの名前で、以下のいずれかの値:Amaya、Blink、EdgeHTML、Flow、Gecko、Goanna、iCab、KHTML、Links、Lynx、NetFront、NetSurf、Presto、Tasman、Trident、w3m、WebKitまたはundefinedversion: (string || undefined) 動的に決定されるブラウザエンジンのバージョン、またはundefined
osname: (string || undefined) OSの名前、undefinedの場合ありversion: (string || undefined) 動的に決定されるOSのバージョン、またはundefined
cpuarchitecture: (string || undefined) CPUのアーキテクチャで、以下のいずれかの値: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)
}FAQ
redirect が 307 と 308 を使用する理由
redirect() を使用すると、一時リダイレクトには 307、恒久リダイレクトには 308 が使用されることに気付くかもしれません。伝統的に、一時リダイレクトには 302、恒久リダイレクトには 301 が使用されていましたが、多くのブラウザは 302 を使用する場合、元のリクエストメソッドに関係なく、リダイレクトのリクエストメソッドを POST から GET に変更していました。
/users から /people へのリダイレクトの例を考えます。新しいユーザーを作成するために /users に POST リクエストを送信し、302 一時リダイレクトに従う場合、リクエストメソッドは POST から GET に変更されます。これは理にかなっていません。新しいユーザーを作成するには、GET リクエストではなく POST リクエストを /people に送信する必要があります。
307 ステータスコードの導入により、リクエストメソッドが POST として保持されるようになりました。
302- 一時リダイレクト、リクエストメソッドをPOSTからGETに変更307- 一時リダイレクト、リクエストメソッドをPOSTとして保持
redirect() メソッドは、デフォルトで 302 一時リダイレクトではなく 307 を使用するため、リクエストは常に POST リクエストとして保持されます。
POST リクエストに対して GET レスポンスを引き起こしたい場合は、303 を使用してください。
HTTPリダイレクトについてさらに学ぶ。
環境変数にアクセスする方法
process.env を使用して、Edgeミドルウェアから環境変数にアクセスできます。これらは 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 |