4.x API
express()
Express アプリケーションを作成します。express()
関数は、express
モジュールによってエクスポートされるトップレベル関数です。
var express = require('express')
var app = express()
メソッド
express.json([options])
このミドルウェアは Express v4.16.0 以降で使用可能です。
これは Express の組み込みミドルウェア関数です。JSON ペイロードを持つ受信リクエストを解析し、body-parser に基づいています。
JSON のみを解析し、Content-Type
ヘッダーが type
オプションと一致するリクエストのみを対象とするミドルウェアを返します。このパーサーは、ボディの任意の Unicode エンコーディングを受け入れ、gzip
および deflate
エンコーディングの自動インフレをサポートします。
解析されたデータを含む新しい body
オブジェクトは、ミドルウェアの後(つまり req.body
)に request
オブジェクトに設定されます。解析するボディがない場合、Content-Type
が一致しなかった場合、またはエラーが発生した場合は、空のオブジェクト({}
)が設定されます。
req.body
の形状はユーザー制御の入力に基づいているため、このオブジェクト内のすべてのプロパティと値は信頼できないため、信頼する前に検証する必要があります。たとえば、req.body.foo.toString()
は複数の方法で失敗する可能性があります。たとえば、foo
が存在しない場合や、文字列ではない場合、toString
が関数ではなく文字列やその他のユーザー入力である場合があります。
次の表に、オプションの options
オブジェクトのプロパティを示します。
プロパティ | 説明 | 型 | デフォルト |
---|---|---|---|
inflate |
deflate(圧縮)されたボディの処理を有効または無効にします。無効にすると、deflate されたボディは拒否されます。 | Boolean | true |
limit |
最大リクエストボディサイズを制御します。これが数値の場合、値はバイト数を指定します。文字列の場合、値は解析のために bytes ライブラリに渡されます。 | 混合 | "100kb" |
reviver |
reviver オプションは、2番目の引数として JSON.parse に直接渡されます。この引数の詳細については、JSON.parse に関する MDN ドキュメント を参照してください。 |
関数 | null |
strict |
配列とオブジェクトのみを受け入れるかどうかを有効または無効にします。無効にすると、JSON.parse が受け入れるものをすべて受け入れます。 |
Boolean | true |
type |
これは、ミドルウェアが解析するメディアタイプを決定するために使用されます。このオプションは、文字列、文字列の配列、または関数のいずれかです。関数ではない場合、type オプションは type-is ライブラリに直接渡され、これは拡張子名 (json など)、MIME タイプ (application/json など)、またはワイルドカード付きの MIME タイプ (*/* や */json など) にすることができます。関数である場合、type オプションは fn(req) として呼び出され、真の値が返された場合にリクエストが解析されます。 |
混合 | "application/json" |
verify |
このオプションを指定すると、verify(req, res, buf, encoding) として呼び出されます。ここで、buf は生のリクエストボディの Buffer であり、encoding はリクエストのエンコーディングです。エラーをスローすると、解析を中止できます。 |
関数 | undefined |
express.raw([options])
このミドルウェアは Express v4.17.0 以降で使用可能です。
これは Express の組み込みミドルウェア関数です。受信リクエストペイロードを Buffer
に解析し、body-parser に基づいています。
すべてのボディを Buffer
として解析し、Content-Type
ヘッダーが type
オプションと一致するリクエストのみを対象とするミドルウェアを返します。このパーサーは、ボディの任意の Unicode エンコーディングを受け入れ、gzip
および deflate
エンコーディングの自動インフレをサポートします。
解析されたデータを含む新しい body
Buffer
は、ミドルウェアの後(つまり req.body
)に request
オブジェクトに設定されます。解析するボディがない場合、Content-Type
が一致しなかった場合、またはエラーが発生した場合は、空のオブジェクト({}
)が設定されます。
req.body
の形状はユーザー制御の入力に基づいているため、このオブジェクト内のすべてのプロパティと値は信頼できないため、信頼する前に検証する必要があります。たとえば、req.body.toString()
は、複数の方法で失敗する可能性があります。たとえば、複数のパーサーをスタックすると、req.body
が異なるパーサーからのものである可能性があります。バッファメソッドを呼び出す前に、req.body
が Buffer
であることをテストすることをお勧めします。
次の表に、オプションの options
オブジェクトのプロパティを示します。
プロパティ | 説明 | 型 | デフォルト |
---|---|---|---|
inflate |
deflate(圧縮)されたボディの処理を有効または無効にします。無効にすると、deflate されたボディは拒否されます。 | Boolean | true |
limit |
最大リクエストボディサイズを制御します。これが数値の場合、値はバイト数を指定します。文字列の場合、値は解析のために bytes ライブラリに渡されます。 | 混合 | "100kb" |
type |
これは、ミドルウェアが解析するメディアタイプを決定するために使用されます。このオプションは、文字列、文字列の配列、または関数のいずれかです。関数ではない場合、type オプションは type-is ライブラリに直接渡され、これは拡張子名 (bin など)、MIME タイプ (application/octet-stream など)、またはワイルドカード付きの MIME タイプ (*/* や application/* など) にすることができます。関数である場合、type オプションは fn(req) として呼び出され、真の値が返された場合にリクエストが解析されます。 |
混合 | "application/octet-stream" |
verify |
このオプションを指定すると、verify(req, res, buf, encoding) として呼び出されます。ここで、buf は生のリクエストボディの Buffer であり、encoding はリクエストのエンコーディングです。エラーをスローすると、解析を中止できます。 |
関数 | undefined |
express.Router([options])
新しい ルーター オブジェクトを作成します。
var router = express.Router([options])
オプションの options
パラメーターは、ルーターの動作を指定します。
プロパティ | 説明 | デフォルト | 可用性 |
---|---|---|---|
caseSensitive |
大文字と小文字を区別します。 | デフォルトでは無効になっており、「/Foo」と「/foo」は同じものとして扱われます。 | |
mergeParams |
親ルーターからの req.params 値を保持します。親と子に競合するパラメーター名がある場合、子の値が優先されます。 |
false |
4.5.0+ |
strict |
厳密なルーティングを有効にします。 | デフォルトでは無効になっており、「/foo」と「/foo/」はルーターによって同じものとして扱われます。 |
アプリケーションと同様に、ミドルウェアと HTTP メソッドルート(get
、put
、post
など)を router
に追加できます。
詳細については、ルーターを参照してください。
express.static(root, [options])
これは Express の組み込みミドルウェア関数です。静的ファイルを提供し、serve-static に基づいています。
注意:最適な結果を得るには、静的アセットの提供パフォーマンスを向上させるために、リバースプロキシ キャッシュを使用してください。
root
引数は、静的アセットを提供するためのルートディレクトリを指定します。関数は、req.url
と指定された root
ディレクトリを組み合わせることによって、提供するファイルを決定します。ファイルが見つからない場合、404 応答を送信する代わりに、next()
を呼び出して次のミドルウェアに進み、スタックとフォールバックを可能にします。
次の表に、options
オブジェクトのプロパティを示します。また、以下の例も参照してください。
プロパティ | 説明 | 型 | デフォルト |
---|---|---|---|
dotfiles |
ドットファイル(ドット「.」で始まるファイルまたはディレクトリ)の処理方法を決定します。 以下の dotfiles を参照してください。 |
String | “ignore” |
etag |
etag 生成を有効または無効にします 注意: express.static は常に弱い ETag を送信します。 |
Boolean | true |
extensions |
ファイル拡張子のフォールバックを設定します。ファイルが見つからない場合は、指定された拡張子のファイルを探し、最初に見つかったファイルを提供します。例:['html', 'htm'] 。 |
混合 | false |
fallthrough |
クライアントエラーを未処理のリクエストとしてフォールスルーさせるか、クライアントエラーを転送します。 以下の fallthrough を参照してください。 |
Boolean | true |
immutable |
Cache-Control 応答ヘッダーで immutable ディレクティブを有効または無効にします。有効にした場合、キャッシュを有効にするために maxAge オプションも指定する必要があります。immutable ディレクティブは、maxAge オプションの有効期間中に、サポートされているクライアントがファイルが変更されたかどうかを確認するための条件付きリクエストを作成するのを防ぎます。 |
Boolean | false |
index |
指定されたディレクトリのインデックスファイルを送信します。ディレクトリのインデックス作成を無効にするには、false に設定します。 |
混合 | “index.html” |
lastModified |
Last-Modified ヘッダーを OS 上のファイルの最終変更日に設定します。 |
Boolean | true |
maxAge |
Cache-Control ヘッダーの max-age プロパティをミリ秒単位、または ms 形式 の文字列で設定します。 | Number | 0 |
redirect |
パス名がディレクトリの場合、末尾の "/" にリダイレクトします。 | Boolean | true |
setHeaders |
ファイルとともに提供する HTTP ヘッダーを設定するための関数。 以下の setHeaders を参照してください。 |
関数 |
詳細については、Express での静的ファイルの提供 および ミドルウェアの使用 - 組み込みミドルウェア を参照してください。
dotfiles
このオプションの可能な値は次のとおりです。
- “allow” - ドットファイルの特別な処理は行いません。
- “deny” - ドットファイルのリクエストを拒否し、
403
で応答し、next()
を呼び出します。 - “ignore” - ドットファイルが存在しないかのように動作し、
404
で応答し、next()
を呼び出します。
注意:デフォルト値では、ドットで始まるディレクトリ内のファイルは無視されません。
fallthrough
このオプションがtrue
の場合、不正なリクエストや存在しないファイルへのリクエストなどのクライアントエラーが発生すると、このミドルウェアは単にnext()
を呼び出し、スタック内の次のミドルウェアを起動します。false
の場合、これらのエラー(404エラーを含む)はnext(err)
を起動します。
このオプションをtrue
に設定すると、複数の物理ディレクトリを同じWebアドレスにマッピングしたり、存在しないファイルをルートで埋めたりできます。
このミドルウェアを単一のファイルシステムディレクトリとして厳密に設計されたパスにマウントしている場合は、false
を使用すると、オーバーヘッドを削減するために404エラーをショートカットできます。このミドルウェアは、すべてのメソッドに応答します。
setHeaders
このオプションでは、カスタムレスポンスヘッダーを設定する関数を指定します。ヘッダーの変更は同期的に行われる必要があります。
関数の署名は次のとおりです。
fn(res, path, stat)
引数
res
、レスポンスオブジェクト。path
、送信されるファイルパス。stat
、送信されるファイルのstat
オブジェクト。
express.staticの例
以下は、詳細なオプションオブジェクトを使用してexpress.static
ミドルウェア関数を使用する例です。
var options = {
dotfiles: 'ignore',
etag: false,
extensions: ['htm', 'html'],
index: false,
maxAge: '1d',
redirect: false,
setHeaders: function (res, path, stat) {
res.set('x-timestamp', Date.now())
}
}
app.use(express.static('public', options))
express.text([options])
このミドルウェアは Express v4.17.0 以降で使用可能です。
これは、Expressに組み込まれているミドルウェア関数です。受信リクエストのペイロードを文字列に解析し、body-parserに基づいています。
すべてのボディを文字列として解析し、Content-Type
ヘッダーがtype
オプションに一致するリクエストのみを対象とするミドルウェアを返します。このパーサーは、ボディの任意のUnicodeエンコーディングを受け入れ、gzip
およびdeflate
エンコーディングの自動インフレをサポートします。
ミドルウェアの後に、解析されたデータを含む新しいbody
文字列がrequest
オブジェクト(つまり、req.body
)に設定されます。または、解析するボディがないか、Content-Type
が一致しなかったか、エラーが発生した場合は、空のオブジェクト({}
)が設定されます。
req.body
の形状はユーザー制御の入力に基づいているため、このオブジェクト内のすべてのプロパティと値は信頼できず、信頼する前に検証する必要があります。たとえば、req.body.trim()
は、複数のパーサーをスタックする場合など、さまざまな方法で失敗する可能性があります。req.body
が文字列であることを確認してから、文字列メソッドを呼び出すことをお勧めします。
次の表に、オプションの options
オブジェクトのプロパティを示します。
プロパティ | 説明 | 型 | デフォルト |
---|---|---|---|
defaultCharset |
リクエストのContent-Type ヘッダーで文字セットが指定されていない場合に、テキストコンテンツのデフォルトの文字セットを指定します。 |
String | "utf-8" |
inflate |
deflate(圧縮)されたボディの処理を有効または無効にします。無効にすると、deflate されたボディは拒否されます。 | Boolean | true |
limit |
最大リクエストボディサイズを制御します。これが数値の場合、値はバイト数を指定します。文字列の場合、値は解析のために bytes ライブラリに渡されます。 | 混合 | "100kb" |
type |
これは、ミドルウェアが解析するメディアタイプを決定するために使用されます。このオプションには、文字列、文字列の配列、または関数を指定できます。関数でない場合、type オプションはtype-isライブラリに直接渡され、これは拡張子名(txt など)、MIMEタイプ(text/plain など)、またはワイルドカード付きのMIMEタイプ(*/* やtext/* など)を指定できます。関数である場合、type オプションはfn(req) として呼び出され、真の値を返す場合にリクエストが解析されます。 |
混合 | "text/plain" |
verify |
このオプションを指定すると、verify(req, res, buf, encoding) として呼び出されます。ここで、buf は生のリクエストボディの Buffer であり、encoding はリクエストのエンコーディングです。エラーをスローすると、解析を中止できます。 |
関数 | undefined |
express.urlencoded([options])
このミドルウェアは Express v4.16.0 以降で使用可能です。
これは、Expressに組み込まれているミドルウェア関数です。URLエンコードされたペイロードを持つ受信リクエストを解析し、body-parserに基づいています。
URLエンコードされたボディのみを解析し、Content-Type
ヘッダーがtype
オプションに一致するリクエストのみを対象とするミドルウェアを返します。このパーサーは、ボディのUTF-8エンコーディングのみを受け入れ、gzip
およびdeflate
エンコーディングの自動インフレをサポートします。
ミドルウェアの後に、解析されたデータを含む新しいbody
オブジェクトがrequest
オブジェクト(つまり、req.body
)に設定されます。または、解析するボディがないか、Content-Type
が一致しなかったか、エラーが発生した場合は、空のオブジェクト({}
)が設定されます。このオブジェクトには、キーと値のペアが含まれます。値は、文字列または配列(extended
がfalse
の場合)または任意の型(extended
がtrue
の場合)にすることができます。
req.body
の形状はユーザー制御の入力に基づいているため、このオブジェクト内のすべてのプロパティと値は信頼できないため、信頼する前に検証する必要があります。たとえば、req.body.foo.toString()
は複数の方法で失敗する可能性があります。たとえば、foo
が存在しない場合や、文字列ではない場合、toString
が関数ではなく文字列やその他のユーザー入力である場合があります。
次の表に、オプションの options
オブジェクトのプロパティを示します。
プロパティ | 説明 | 型 | デフォルト |
---|---|---|---|
extended |
このオプションでは、URLエンコードされたデータをquerystring ライブラリ(false の場合)またはqs ライブラリ(true の場合)で解析するかを選択できます。「extended」構文を使用すると、リッチオブジェクトと配列をURLエンコード形式にエンコードでき、URLエンコードでJSONのようなエクスペリエンスを実現できます。詳細については、qsライブラリを参照してください。 |
Boolean | true |
inflate |
deflate(圧縮)されたボディの処理を有効または無効にします。無効にすると、deflate されたボディは拒否されます。 | Boolean | true |
limit |
最大リクエストボディサイズを制御します。これが数値の場合、値はバイト数を指定します。文字列の場合、値は解析のために bytes ライブラリに渡されます。 | 混合 | "100kb" |
parameterLimit |
このオプションは、URLエンコードされたデータで許可されるパラメーターの最大数を制御します。リクエストにこの値より多くのパラメーターが含まれている場合は、エラーが発生します。 | Number | 1000 |
type |
これは、ミドルウェアが解析するメディアタイプを決定するために使用されます。このオプションには、文字列、文字列の配列、または関数を指定できます。関数でない場合、type オプションはtype-isライブラリに直接渡され、これは拡張子名(urlencoded など)、MIMEタイプ(application/x-www-form-urlencoded など)、またはワイルドカード付きのMIMEタイプ(*/x-www-form-urlencoded など)を指定できます。関数である場合、type オプションはfn(req) として呼び出され、真の値を返す場合にリクエストが解析されます。 |
混合 | "application/x-www-form-urlencoded" |
verify |
このオプションを指定すると、verify(req, res, buf, encoding) として呼び出されます。ここで、buf は生のリクエストボディの Buffer であり、encoding はリクエストのエンコーディングです。エラーをスローすると、解析を中止できます。 |
関数 | undefined |
アプリケーション
app
オブジェクトは、慣例としてExpressアプリケーションを示します。Expressモジュールによってエクスポートされるトップレベルのexpress()
関数を呼び出して作成します。
var express = require('express')
var app = express()
app.get('/', function (req, res) {
res.send('hello world')
})
app.listen(3000)
app
オブジェクトには、次のためのメソッドがあります。
- HTTPリクエストのルーティング。たとえば、app.METHODおよびapp.paramを参照してください。
- ミドルウェアの構成。 app.routeを参照してください。
- HTMLビューのレンダリング。 app.renderを参照してください。
- テンプレートエンジンの登録。 app.engineを参照してください。
また、アプリケーションの動作に影響を与える設定(プロパティ)もあります。詳細については、アプリケーション設定を参照してください。
Expressアプリケーションオブジェクトは、それぞれreq.app
およびres.app
として、リクエストオブジェクトおよびレスポンスオブジェクトから参照できます。
プロパティ
app.locals
app.locals
オブジェクトには、アプリケーション内のローカル変数であるプロパティがあり、res.renderでレンダリングされたテンプレートで利用できます。
locals
オブジェクトは、レスポンスをレンダリングするためにビューエンジンで使用されます。オブジェクトキーは特に機密性が高く、ビューエンジンの操作に影響を与えたり、クロスサイトスクリプティングへのパスを提供したりする可能性があるため、ユーザーが制御する入力を含めないでください。追加の考慮事項については、使用されているビューエンジンのドキュメントを参照してください。
console.dir(app.locals.title)
// => 'My App'
console.dir(app.locals.email)
// => 'me@myapp.com'
設定されると、app.locals
プロパティの値はアプリケーションのライフサイクル全体を通じて保持されます。これは、リクエストのライフサイクルに対してのみ有効なres.localsプロパティとは対照的です。
アプリケーション内でレンダリングされたテンプレートでローカル変数にアクセスできます。これは、テンプレートにヘルパー関数を提供するだけでなく、アプリケーションレベルのデータを提供する場合にも役立ちます。ローカル変数は、ミドルウェアでreq.app.locals
(req.appを参照)を介して利用できます。
app.locals.title = 'My App'
app.locals.strftime = require('strftime')
app.locals.email = 'me@myapp.com'
app.mountpath
app.mountpath
プロパティには、サブアプリがマウントされた1つ以上のパスパターンが含まれています。
サブアプリは、ルートへのリクエストの処理に使用できるexpress
のインスタンスです。
var express = require('express')
var app = express() // the main app
var admin = express() // the sub app
admin.get('/', function (req, res) {
console.log(admin.mountpath) // /admin
res.send('Admin Homepage')
})
app.use('/admin', admin) // mount the sub app
req
オブジェクトのbaseUrlプロパティに似ていますが、req.baseUrl
は一致したURLパスを返すのに対し、一致したパターンを返します。
サブアプリが複数のパスパターンにマウントされている場合、app.mountpath
は次の例に示すように、マウントされているパターンのリストを返します。
var admin = express()
admin.get('/', function (req, res) {
console.dir(admin.mountpath) // [ '/adm*n', '/manager' ]
res.send('Admin Homepage')
})
var secret = express()
secret.get('/', function (req, res) {
console.log(secret.mountpath) // /secr*t
res.send('Admin Secret')
})
admin.use('/secr*t', secret) // load the 'secret' router on '/secr*t', on the 'admin' sub app
app.use(['/adm*n', '/manager'], admin) // load the 'admin' router on '/adm*n' and '/manager', on the parent app
イベント
app.on('mount', callback(parent))
mount
イベントは、サブアプリが親アプリにマウントされるときにサブアプリで発生します。親アプリはコールバック関数に渡されます。
注意
サブアプリは
- デフォルト値を持つ設定の値を継承しません。サブアプリで値を設定する必要があります。
- デフォルト値がない設定の値を継承します。
詳細については、アプリケーション設定を参照してください。
var admin = express()
admin.on('mount', function (parent) {
console.log('Admin Mounted')
console.log(parent) // refers to the parent app
})
admin.get('/', function (req, res) {
res.send('Admin Homepage')
})
app.use('/admin', admin)
メソッド
app.all(path, callback [, callback ...])
このメソッドは、すべてのHTTP動詞に一致することを除いて、標準のapp.METHOD()メソッドに似ています。
引数
引数 | 説明 | デフォルト |
---|---|---|
path |
ミドルウェア関数が呼び出されるパス。次のいずれかになります。
|
'/'(ルートパス) |
callback |
コールバック関数。次のようなものがあります。
ミドルウェアのように動作する複数のコールバック関数を指定できます。ただし、これらのコールバックは ルーターとアプリはミドルウェアインターフェイスを実装するため、他のミドルウェア関数と同じように使用できます。 例については、ミドルウェアコールバック関数の例を参照してください。 |
なし |
例
次のコールバックは、GET、POST、PUT、DELETE、またはその他のHTTPリクエストメソッドを使用するかどうかに関係なく、/secret
へのリクエストに対して実行されます。
app.all('/secret', function (req, res, next) {
console.log('Accessing the secret section ...')
next() // pass control to the next handler
})
app.all()
メソッドは、特定のパスプレフィックスまたは任意の合致に対する「グローバル」ロジックのマッピングに役立ちます。たとえば、他のすべてのルート定義の先頭に以下を配置すると、その時点からのすべてのルートで認証が必要になり、ユーザーが自動的にロードされます。これらのコールバックはエンドポイントとして機能する必要がないことに注意してください。loadUser
はタスクを実行し、next()
を呼び出して後続のルートのマッチングを続行できます。
app.all('*', requireAuthentication, loadUser)
または、同等の
app.all('*', requireAuthentication)
app.all('*', loadUser)
別の例は、ホワイトリスト化された「グローバル」機能です。例は上記の例に似ていますが、「/api」で始まるパスのみを制限します。
app.all('/api/*', requireAuthentication)
app.delete(path, callback [, callback ...])
指定されたコールバック関数を使用して、指定されたパスへのHTTP DELETEリクエストをルーティングします。詳細については、ルーティングガイドを参照してください。
引数
引数 | 説明 | デフォルト |
---|---|---|
path |
ミドルウェア関数が呼び出されるパス。次のいずれかになります。
|
'/'(ルートパス) |
callback |
コールバック関数。次のようなものがあります。
ミドルウェアのように動作する複数のコールバック関数を指定できます。ただし、これらのコールバックは ルーターとアプリはミドルウェアインターフェイスを実装するため、他のミドルウェア関数と同じように使用できます。 例については、ミドルウェアコールバック関数の例を参照してください。 |
なし |
例
app.delete('/', function (req, res) {
res.send('DELETE request to homepage')
})
app.disable(name)
ブール設定name
をfalse
に設定します。ここで、name
はアプリ設定テーブルのプロパティの1つです。ブールプロパティに対してapp.set('foo', false)
を呼び出すことは、app.disable('foo')
を呼び出すことと同じです。
例:
app.disable('trust proxy')
app.get('trust proxy')
// => false
app.disabled(name)
ブール設定name
が無効(false
)の場合(name
はアプリ設定テーブルのプロパティの1つ)、true
を返します。
app.disabled('trust proxy')
// => true
app.enable('trust proxy')
app.disabled('trust proxy')
// => false
app.enable(name)
ブール設定name
をtrue
に設定します。ここで、name
はアプリ設定テーブルのプロパティの1つです。ブールプロパティに対してapp.set('foo', true)
を呼び出すことは、app.enable('foo')
を呼び出すことと同じです。
app.enable('trust proxy')
app.get('trust proxy')
// => true
app.enabled(name)
設定name
が有効(true
)の場合(name
はアプリ設定テーブルのプロパティの1つ)、true
を返します。
app.enabled('trust proxy')
// => false
app.enable('trust proxy')
app.enabled('trust proxy')
// => true
app.engine(ext, callback)
指定されたテンプレートエンジンcallback
をext
として登録します。
デフォルトでは、Expressはファイル拡張子に基づいてエンジンをrequire()
します。たとえば、「foo.pug」ファイルをレンダリングしようとすると、Expressは内部で次を呼び出し、パフォーマンスを向上させるために後続の呼び出しでrequire()
をキャッシュします。
app.engine('pug', require('pug').__express)
このメソッドは、すぐに.__express
を提供しないエンジン、またはテンプレートエンジンに別の拡張子を「マッピング」する場合に使用します。
たとえば、EJSテンプレートエンジンを「.html」ファイルにマッピングするには
app.engine('html', require('ejs').renderFile)
この場合、EJSはExpressが期待するのと同じ署名を持つ.renderFile()
メソッド((path, options, callback)
)を提供します。ただし、内部でこのメソッドをejs.__express
としてエイリアスしているため、「.ejs」拡張機能を使用している場合は何もする必要がないことに注意してください。
一部のテンプレートエンジンはこの規則に従いません。consolidate.jsライブラリは、Nodeテンプレートエンジンをこの規則に従うようにマッピングするため、Expressでシームレスに動作します。
var engines = require('consolidate')
app.engine('haml', engines.haml)
app.engine('html', engines.hogan)
app.get(name)
name
アプリ設定の値を返します。ここで、name
はアプリ設定テーブルの文字列の1つです。例:
app.get('title')
// => undefined
app.set('title', 'My Site')
app.get('title')
// => "My Site"
app.get(path, callback [, callback ...])
指定されたパスへのHTTP GETリクエストを、指定されたコールバック関数で処理します。
引数
引数 | 説明 | デフォルト |
---|---|---|
path |
ミドルウェア関数が呼び出されるパス。次のいずれかになります。
|
'/'(ルートパス) |
callback |
コールバック関数。次のようなものがあります。
ミドルウェアのように動作する複数のコールバック関数を指定できます。ただし、これらのコールバックは ルーターとアプリはミドルウェアインターフェイスを実装するため、他のミドルウェア関数と同じように使用できます。 例については、ミドルウェアコールバック関数の例を参照してください。 |
なし |
詳細については、ルーティングガイドを参照してください。
例
app.get('/', function (req, res) {
res.send('GET request to homepage')
})
app.listen(path, [callback])
UNIXソケットを起動し、指定されたパスでの接続を待ち受けます。このメソッドは、Nodeのhttp.Server.listen()と同じです。
var express = require('express')
var app = express()
app.listen('/tmp/sock')
app.listen([port[, host[, backlog]]][, callback])
指定されたホストとポートでの接続をバインドして待ち受けます。このメソッドは、Nodeのhttp.Server.listen()と同じです。
portを省略するか、0を指定すると、オペレーティングシステムが任意の未使用ポートを割り当てます。これは自動化されたタスク(テストなど)の場合に便利です。
var express = require('express')
var app = express()
app.listen(3000)
express()
によって返されるapp
は、実際にはJavaScriptのFunction
であり、リクエストを処理するためのコールバックとしてNodeのHTTPサーバーに渡されるように設計されています。これにより、アプリはこれらの(単なるコールバックである)サーバーから継承しないため、同じコードベースでHTTPとHTTPSの両方のバージョンのアプリを簡単に提供できます。
var express = require('express')
var https = require('https')
var http = require('http')
var app = express()
http.createServer(app).listen(80)
https.createServer(options, app).listen(443)
app.listen()
メソッドはhttp.Serverオブジェクトを返し、(HTTPの場合)以下の便利なメソッドです。
app.listen = function () {
var server = http.createServer(this)
return server.listen.apply(server, arguments)
}
注意:Nodeのhttp.Server.listen()メソッドのすべての形式が、実際にはサポートされています。
app.METHOD(path, callback [, callback ...])
HTTPリクエストをルーティングします。METHODは、GET、PUT、POSTなどのリクエストのHTTPメソッドを小文字で表します。したがって、実際のメソッドはapp.get()
、app.post()
、app.put()
などです。完全なリストについては、下記のルーティングメソッドを参照してください。
引数
引数 | 説明 | デフォルト |
---|---|---|
path |
ミドルウェア関数が呼び出されるパス。次のいずれかになります。
|
'/'(ルートパス) |
callback |
コールバック関数。次のようなものがあります。
ミドルウェアのように動作する複数のコールバック関数を指定できます。ただし、これらのコールバックは ルーターとアプリはミドルウェアインターフェイスを実装するため、他のミドルウェア関数と同じように使用できます。 例については、ミドルウェアコールバック関数の例を参照してください。 |
なし |
ルーティングメソッド
Expressは、同じ名前のHTTPメソッドに対応する以下のルーティングメソッドをサポートしています。
|
|
|
APIドキュメントには、最も一般的なHTTPメソッドであるapp.get()
、app.post()
、app.put()
、およびapp.delete()
のエントリのみが明示的に記載されています。ただし、上記の他のメソッドはまったく同じように機能します。
無効なJavaScript変数名に変換されるメソッドをルーティングするには、ブラケット表記を使用します。たとえば、app['m-search']('/', function ...
のようにします。
app.get()
関数は、app.get()
の前にapp.head()
がパスに対して呼び出されなかった場合、HTTP GET
メソッドに加えて、HTTP HEAD
メソッドに対して自動的に呼び出されます。
メソッドapp.all()
は、どのHTTPメソッドにも由来せず、すべてのHTTPリクエストメソッドに対して、指定されたパスでミドルウェアをロードします。詳細については、app.allを参照してください。
ルーティングの詳細については、ルーティングガイドを参照してください。
app.param([name], callback)
ルートパラメーターにコールバックトリガーを追加します。ここで、name
はパラメーターの名前またはそれらの配列であり、callback
はコールバック関数です。コールバック関数のパラメーターは、リクエストオブジェクト、レスポンスオブジェクト、次のミドルウェア、パラメーターの値、パラメーターの名前の順です。
name
が配列の場合、callback
トリガーは、宣言された順序で、その中で宣言された各パラメーターに対して登録されます。さらに、宣言された最後のパラメーターを除く各パラメーターについて、コールバック内のnext
の呼び出しは、次に宣言されたパラメーターのコールバックを呼び出します。最後のパラメーターの場合、next
の呼び出しは、name
が単なる文字列の場合と同じように、現在処理中のルートの次のミドルウェアを呼び出します。
たとえば、ルートパスに:user
が存在する場合、ユーザーロードロジックをマッピングして、req.user
をルートに自動的に提供したり、パラメーター入力の検証を実行したりできます。
app.param('user', function (req, res, next, id) {
// try to get the user details from the User model and attach it to the request object
User.find(id, function (err, user) {
if (err) {
next(err)
} else if (user) {
req.user = user
next()
} else {
next(new Error('failed to load user'))
}
})
})
Paramコールバック関数は、それらが定義されているルーターにローカルです。それらは、マウントされたアプリやルーターによって継承されません。したがって、app
で定義されたparamコールバックは、app
ルートで定義されたルートパラメーターによってのみトリガーされます。
すべてのparamコールバックは、paramが発生するすべてのルートのハンドラーよりも前に呼び出され、次の例に示すように、パラメーターが複数のルートで一致する場合でも、リクエスト-レスポンスサイクルでそれぞれ1回だけ呼び出されます。
app.param('id', function (req, res, next, id) {
console.log('CALLED ONLY ONCE')
next()
})
app.get('/user/:id', function (req, res, next) {
console.log('although this matches')
next()
})
app.get('/user/:id', function (req, res) {
console.log('and this matches too')
res.end()
})
GET /user/42
では、以下が出力されます
CALLED ONLY ONCE
although this matches
and this matches too
app.param(['id', 'page'], function (req, res, next, value) {
console.log('CALLED ONLY ONCE with', value)
next()
})
app.get('/user/:id/:page', function (req, res, next) {
console.log('although this matches')
next()
})
app.get('/user/:id/:page', function (req, res) {
console.log('and this matches too')
res.end()
})
GET /user/42/3
では、以下が出力されます
CALLED ONLY ONCE with 42
CALLED ONLY ONCE with 3
although this matches
and this matches too
次のセクションでは、v4.11.0以降で非推奨になったapp.param(callback)
について説明します。
app.param(name, callback)
メソッドの動作は、関数のみをapp.param()
に渡すことによって完全に変更できます。この関数は、app.param(name, callback)
がどのように動作すべきかのカスタム実装です。2つのパラメーターを受け取り、ミドルウェアを返す必要があります。
この関数の最初のパラメーターは、キャプチャする必要があるURLパラメーターの名前であり、2番目のパラメーターは、ミドルウェアの実装を返すために使用される可能性のある任意のJavaScriptオブジェクトです。
関数によって返されるミドルウェアは、URLパラメーターがキャプチャされたときの動作を決定します。
この例では、app.param(name, callback)
シグネチャはapp.param(name, accessId)
に変更されています。名前とコールバックを受け入れる代わりに、app.param()
は名前と数値を受け入れるようになります。
var express = require('express')
var app = express()
// customizing the behavior of app.param()
app.param(function (param, option) {
return function (req, res, next, val) {
if (val === option) {
next()
} else {
next('route')
}
}
})
// using the customized app.param()
app.param('id', 1337)
// route to trigger the capture
app.get('/user/:id', function (req, res) {
res.send('OK')
})
app.listen(3000, function () {
console.log('Ready')
})
この例では、app.param(name, callback)
シグネチャは同じままですが、ミドルウェアコールバックの代わりに、ユーザーIDのデータ型を検証するためのカスタムデータ型チェック関数が定義されています。
app.param(function (param, validator) {
return function (req, res, next, val) {
if (validator(val)) {
next()
} else {
next('route')
}
}
})
app.param('id', function (candidate) {
return !isNaN(parseFloat(candidate)) && isFinite(candidate)
})
キャプチャ正規表現で文字をキャプチャするために「.
」文字を使用することはできません。たとえば、'/user-.+/'
を使用して'users-gami'
をキャプチャすることはできません。代わりに[\\s\\S]
または[\\w\\W]
を使用してください(例:'/user-[\\s\\S]+/'
)。
例
// captures '1-a_6' but not '543-azser-sder'
router.get('/[0-9]+-[[\\w]]*', function (req, res, next) { next() })
// captures '1-a_6' and '543-az(ser"-sder' but not '5-a s'
router.get('/[0-9]+-[[\\S]]*', function (req, res, next) { next() })
// captures all (equivalent to '.*')
router.get('[[\\s\\S]]*', function (req, res, next) { next() })
app.path()
アプリの正規パスである文字列を返します。
var app = express()
var blog = express()
var blogAdmin = express()
app.use('/blog', blog)
blog.use('/admin', blogAdmin)
console.dir(app.path()) // ''
console.dir(blog.path()) // '/blog'
console.dir(blogAdmin.path()) // '/blog/admin'
このメソッドの動作は、マウントされたアプリの複雑なケースでは非常に複雑になる可能性があります。アプリの正規パスを取得するには、req.baseUrlを使用する方が通常は優れています。
app.post(path, callback [, callback ...])
指定されたパスへのHTTP POSTリクエストを、指定されたコールバック関数で処理します。詳細については、ルーティングガイドを参照してください。
引数
引数 | 説明 | デフォルト |
---|---|---|
path |
ミドルウェア関数が呼び出されるパス。次のいずれかになります。
|
'/'(ルートパス) |
callback |
コールバック関数。次のようなものがあります。
ミドルウェアのように動作する複数のコールバック関数を指定できます。ただし、これらのコールバックは ルーターとアプリはミドルウェアインターフェイスを実装するため、他のミドルウェア関数と同じように使用できます。 例については、ミドルウェアコールバック関数の例を参照してください。 |
なし |
例
app.post('/', function (req, res) {
res.send('POST request to homepage')
})
app.put(path, callback [, callback ...])
指定されたパスへのHTTP PUTリクエストを、指定されたコールバック関数で処理します。
引数
引数 | 説明 | デフォルト |
---|---|---|
path |
ミドルウェア関数が呼び出されるパス。次のいずれかになります。
|
'/'(ルートパス) |
callback |
コールバック関数。次のようなものがあります。
ミドルウェアのように動作する複数のコールバック関数を指定できます。ただし、これらのコールバックは ルーターとアプリはミドルウェアインターフェイスを実装するため、他のミドルウェア関数と同じように使用できます。 例については、ミドルウェアコールバック関数の例を参照してください。 |
なし |
例
app.put('/', function (req, res) {
res.send('PUT request to homepage')
})
app.render(view, [locals], callback)
callback
関数を介して、ビューのレンダリングされたHTMLを返します。ビューのローカル変数を含むオブジェクトであるオプションのパラメーターを受け入れます。res.render()に似ていますが、それ自体でレンダリングされたビューをクライアントに送信することはできません。
app.render()
は、レンダリングされたビューストリングを生成するためのユーティリティ関数と考えてください。内部的には、res.render()
はapp.render()
を使用してビューをレンダリングします。
view
引数は、ディスクからファイルを読み取ったり、Node.jsモジュールを評価したりするなどのファイルシステム操作を実行するため、セキュリティ上の理由からエンドユーザーからの入力を含めるべきではありません。
locals
オブジェクトは、レスポンスをレンダリングするためにビューエンジンで使用されます。オブジェクトキーは特に機密性が高く、ビューエンジンの操作に影響を与えたり、クロスサイトスクリプティングへのパスを提供したりする可能性があるため、ユーザーが制御する入力を含めないでください。追加の考慮事項については、使用されているビューエンジンのドキュメントを参照してください。
ローカル変数cache
は、ビューキャッシュを有効にするために予約されています。開発中にビューをキャッシュする場合は、true
に設定します。ビューキャッシュは、本番環境ではデフォルトで有効になっています。
app.render('email', function (err, html) {
// ...
})
app.render('email', { name: 'Tobi' }, function (err, html) {
// ...
})
app.route(path)
単一ルートのインスタンスを返します。これを使用して、オプションのミドルウェアでHTTP動詞を処理できます。app.route()
を使用して、重複するルート名(およびそれによるタイプミスエラー)を回避します。
var app = express()
app.route('/events')
.all(function (req, res, next) {
// runs for all HTTP verbs first
// think of it as route specific middleware!
})
.get(function (req, res, next) {
res.json({})
})
.post(function (req, res, next) {
// maybe add a new event...
})
app.set(name, value)
設定name
をvalue
に割り当てます。任意の値を格納できますが、特定の名前を使用してサーバーの動作を構成できます。これらの特別な名前は、アプリ設定テーブルにリストされています。
ブールプロパティに対してapp.set('foo', true)
を呼び出すことは、app.enable('foo')
を呼び出すことと同じです。同様に、ブールプロパティに対してapp.set('foo', false)
を呼び出すことは、app.disable('foo')
を呼び出すことと同じです。
app.get()
を使用して、設定の値を取得します。
app.set('title', 'My Site')
app.get('title') // "My Site"
アプリケーション設定
次の表は、アプリケーション設定を示しています。
サブアプリは
- デフォルト値を持つ設定の値を継承しません。サブアプリで値を設定する必要があります。
- デフォルト値のない設定の値を継承します。これらは下の表に明示的に示されています。
例外:サブアプリは、デフォルト値を持っている場合でも、trust proxy
の値を継承します(下位互換性のために)。サブアプリは、本番環境(NODE_ENV
が「production」の場合)でview cache
の値を継承しません。
プロパティ | 型 | 説明 | デフォルト |
---|---|---|---|
|
Boolean | 大文字と小文字を区別するルーティングを有効にします。有効にすると、「/Foo」と「/foo」は異なるルートになります。無効にすると、「/Foo」と「/foo」は同じものとして扱われます。 注意:サブアプリは、この設定の値を継承します。 |
N/A(未定義) |
|
String | 環境モード。本番環境では必ず「production」に設定してください。「本番環境のベストプラクティス:パフォーマンスと信頼性」を参照してください。 |
|
|
変化あり |
ETag応答ヘッダーを設定します。可能な値については、 |
|
|
String | デフォルトのJSONPコールバック名を指定します。 |
「callback」 |
|
Boolean |
注意:サブアプリは、この設定の値を継承します。 |
N/A(未定義) |
|
変化あり | `JSON.stringify`で使用される「replacer」引数。 注意:サブアプリは、この設定の値を継承します。 |
N/A(未定義) |
|
変化あり | `JSON.stringify`で使用される「space」引数。これは通常、整形されたJSONをインデントするために使用するスペースの数に設定されます。 注意:サブアプリは、この設定の値を継承します。 |
N/A(未定義) |
|
変化あり |
値を 単純なクエリパーサーは、Nodeのネイティブクエリパーサーであるquerystringに基づいています。 拡張クエリパーサーは、qsに基づいています。 カスタムクエリ文字列解析関数は、完全なクエリ文字列を受け取り、クエリキーとその値のオブジェクトを返す必要があります。 |
「extended」 |
|
Boolean | 厳密なルーティングを有効にします。有効にすると、ルーターは「/foo」と「/foo/」を異なるものとして扱います。それ以外の場合、ルーターは「/foo」と「/foo/」を同じものとして扱います。 注意:サブアプリは、この設定の値を継承します。 |
N/A(未定義) |
|
Number | サブドメインにアクセスするために削除するホストのドットで区切られた部分の数。 | 2 |
|
変化あり |
アプリが前面のプロキシの背後にあり、 有効にすると、Expressは前面のプロキシまたは一連のプロキシを介して接続されたクライアントのIPアドレスを特定しようとします。次に、`req.ips`プロパティには、クライアントが接続されているIPアドレスの配列が含まれます。有効にするには、trust proxyオプションテーブルで説明されている値を使用します。
注意:サブアプリは、デフォルト値を持っている場合でも、この設定の値を継承します。 |
|
|
文字列または配列 | アプリケーションのビューのディレクトリまたはディレクトリの配列。配列の場合、ビューは配列内で出現する順に検索されます。 |
|
|
Boolean | ビューテンプレートのコンパイルキャッシュを有効にします。 注: サブアプリは、本番環境(`NODE_ENV`が「production」の場合)でこの設定の値を継承しません。 |
本番環境では |
|
String | 省略時に使用するデフォルトのエンジン拡張子。 注意:サブアプリは、この設定の値を継承します。 |
N/A(未定義) |
|
Boolean | 「X-Powered-By: Express」HTTPヘッダーを有効にします。 |
|
「trust proxy」設定のオプション
詳細については、Express プロキシの背後を参照してください。
型 | 値 |
---|---|
Boolean |
|
String カンマ区切りの値を含む文字列 文字列の配列 |
信頼するIPアドレス、サブネット、またはIPアドレスとサブネットの配列。事前設定済みのサブネット名は次のとおりです。
次のいずれかの方法でIPアドレスを設定します 単一のサブネットを指定する
サブネットとアドレスを指定する
複数のサブネットをCSVとして指定する
複数のサブネットを配列として指定する
指定すると、IPアドレスまたはサブネットはアドレス決定プロセスから除外され、アプリケーションサーバーに最も近い信頼されていないIPアドレスがクライアントのIPアドレスとして決定されます。 |
Number |
フロントエンドプロキシサーバーからのn番目のホップをクライアントとして信頼します。 |
関数 |
カスタム信頼の実装。これを実行する意味を理解している場合にのみ使用してください。
|
「etag」設定のオプション
注: これらの設定は、静的ファイルではなく動的ファイルにのみ適用されます。express.staticミドルウェアはこれらの設定を無視します。
ETag機能は、etagパッケージを使用して実装されています。詳細については、そのドキュメントを参照してください。
型 | 値 |
---|---|
Boolean |
|
String | 「strong」の場合、強いETagを有効にします。 「weak」の場合、弱いETagを有効にします。 |
関数 |
カスタムETag関数の実装。これを実行する意味を理解している場合にのみ使用してください。
|
app.use([path,] callback [, callback...])
指定されたミドルウェア関数または関数を指定されたパスにマウントします。リクエストされたパスのベースがpath
と一致すると、ミドルウェア関数が実行されます。
引数
引数 | 説明 | デフォルト |
---|---|---|
path |
ミドルウェア関数が呼び出されるパス。次のいずれかになります。
|
'/'(ルートパス) |
callback |
コールバック関数。次のようなものがあります。
ミドルウェアのように動作する複数のコールバック関数を指定できます。ただし、これらのコールバックは ルーターとアプリはミドルウェアインターフェイスを実装するため、他のミドルウェア関数と同じように使用できます。 例については、ミドルウェアコールバック関数の例を参照してください。 |
なし |
説明
ルートは、「/
」を使用してそのパスに続く任意のパスにすぐ一致します。例:app.use('/apple', ...)
は、「/apple」、「/apple/images」、「/apple/images/news」などに一致します。
path
のデフォルトは「/」なので、パスなしでマウントされたミドルウェアは、アプリへのすべてのリクエストに対して実行されます。
たとえば、このミドルウェア関数は、アプリへのすべてのリクエストに対して実行されます
app.use(function (req, res, next) {
console.log('Time: %d', Date.now())
next()
})
注意
サブアプリは
- デフォルト値を持つ設定の値を継承しません。サブアプリで値を設定する必要があります。
- デフォルト値がない設定の値を継承します。
詳細については、アプリケーション設定を参照してください。
ミドルウェア関数は順番に実行されるため、ミドルウェアの包含順序が重要です。
// this middleware will not allow the request to go beyond it
app.use(function (req, res, next) {
res.send('Hello World')
})
// requests will never reach this route
app.get('/', function (req, res) {
res.send('Welcome')
})
エラー処理ミドルウェア
エラー処理ミドルウェアは、常に4つの引数を取ります。エラー処理ミドルウェア関数として識別するには、4つの引数を指定する必要があります。next
オブジェクトを使用する必要がない場合でも、シグネチャを維持するために指定する必要があります。そうしないと、next
オブジェクトは通常のミドルウェアとして解釈され、エラーを処理できません。エラー処理ミドルウェアの詳細については、エラー処理を参照してください。
エラー処理ミドルウェア関数は、3つではなく4つの引数、特に(err, req, res, next)
のシグネチャを除いて、他のミドルウェア関数と同じ方法で定義します
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
パスの例
次の表に、ミドルウェアをマウントするための有効なpath
値の簡単な例をいくつか示します。
型 | 例 |
---|---|
パス |
これは
|
パスパターン |
これは
これは
これは
これは
|
正規表現 |
これは
|
配列 |
これは
|
ミドルウェアコールバック関数の例
次の表に、app.use()
、app.METHOD()
、およびapp.all()
へのcallback
引数として使用できるミドルウェア関数の簡単な例をいくつか示します。例はapp.use()
に関するものですが、app.use()
、app.METHOD()
、およびapp.all()
でも有効です。
使用法 | 例 |
---|---|
単一のミドルウェア |
ミドルウェア関数をローカルで定義してマウントできます。
ルーターは有効なミドルウェアです。
Expressアプリは有効なミドルウェアです。
|
ミドルウェアのシリーズ |
同じマウントパスで複数のミドルウェア関数を指定できます。
|
配列 |
配列を使用してミドルウェアを論理的にグループ化します。
|
組み合わせ |
上記のすべてのミドルウェアのマウント方法を組み合わせることができます。
|
以下に、Expressアプリでexpress.staticミドルウェアを使用する例をいくつか示します。
アプリケーションディレクトリの「public」ディレクトリからアプリの静的コンテンツを提供します
// GET /style.css etc
app.use(express.static(path.join(__dirname, 'public')))
リクエストパスに「/static」がプレフィックスとして付いている場合にのみ静的コンテンツを提供するように、「/static」にミドルウェアをマウントします
// GET /static/style.css etc.
app.use('/static', express.static(path.join(__dirname, 'public')))
静的ミドルウェアの後にロガーミドルウェアをロードすることにより、静的コンテンツリクエストのロギングを無効にします
app.use(express.static(path.join(__dirname, 'public')))
app.use(logger())
複数のディレクトリから静的ファイルを提供しますが、他のディレクトリよりも「./public」を優先します
app.use(express.static(path.join(__dirname, 'public')))
app.use(express.static(path.join(__dirname, 'files')))
app.use(express.static(path.join(__dirname, 'uploads')))
リクエスト
req
オブジェクトはHTTPリクエストを表し、リクエストクエリ文字列、パラメーター、ボディ、HTTPヘッダーなどのプロパティを持ちます。このドキュメントおよび慣例により、オブジェクトは常にreq
(およびHTTPレスポンスはres
)と呼ばれますが、その実際の名前は、作業しているコールバック関数のパラメーターによって決定されます。
例:
app.get('/user/:id', function (req, res) {
res.send('user ' + req.params.id)
})
ただし、次のようにすることもできます
app.get('/user/:id', function (request, response) {
response.send('user ' + request.params.id)
})
req
オブジェクトは、Node独自のリクエストオブジェクトの拡張バージョンであり、すべての組み込みフィールドとメソッドをサポートしています。
プロパティ
Express 4では、デフォルトでreq.files
はreq
オブジェクトで使用できなくなりました。req.files
オブジェクトでアップロードされたファイルにアクセスするには、busboy、multer、formidable、multiparty、connect-multiparty、またはpezのようなマルチパート処理ミドルウェアを使用してください。
req.app
このプロパティは、ミドルウェアを使用しているExpressアプリケーションのインスタンスへの参照を保持します。
ミドルウェア関数をエクスポートするだけのモジュールを作成し、メインファイルでrequire()
するというパターンに従う場合、ミドルウェアはreq.app
を介してExpressインスタンスにアクセスできます
例:
// index.js
app.get('/viewdirectory', require('./mymiddleware.js'))
// mymiddleware.js
module.exports = function (req, res) {
res.send('The views directory is ' + req.app.get('views'))
}
req.baseUrl
ルーターインスタンスがマウントされたURLパス。
req.baseUrl
プロパティは、app
オブジェクトのmountpathプロパティに似ていますが、app.mountpath
は一致したパスパターンを返します。
例:
var greet = express.Router()
greet.get('/jp', function (req, res) {
console.log(req.baseUrl) // /greet
res.send('Konichiwa!')
})
app.use('/greet', greet) // load the router on '/greet'
ルーターをロードするためにパスパターンまたはパスパターンのセットを使用する場合でも、baseUrl
プロパティはパターンではなく、一致した文字列を返します。次の例では、greet
ルーターは2つのパスパターンでロードされます。
app.use(['/gre+t', '/hel{2}o'], greet) // load the router on '/gre+t' and '/hel{2}o'
/greet/jp
へのリクエストが行われると、req.baseUrl
は「/greet」になります。/hello/jp
へのリクエストが行われると、req.baseUrl
は「/hello」になります。
req.body
リクエストボディで送信されたデータのキーと値のペアが含まれています。デフォルトでは、undefined
であり、express.json()
やexpress.urlencoded()
などのボディ解析ミドルウェアを使用すると入力されます。
req.body
の形状はユーザー制御の入力に基づいているため、このオブジェクト内のすべてのプロパティと値は信頼できないため、信頼する前に検証する必要があります。たとえば、req.body.foo.toString()
は複数の方法で失敗する可能性があります。たとえば、foo
が存在しない場合や、文字列ではない場合、toString
が関数ではなく文字列やその他のユーザー入力である場合があります。
次の例は、ボディ解析ミドルウェアを使用してreq.body
を設定する方法を示しています。
var express = require('express')
var app = express()
app.use(express.json()) // for parsing application/json
app.use(express.urlencoded({ extended: true })) // for parsing application/x-www-form-urlencoded
app.post('/profile', function (req, res, next) {
console.log(req.body)
res.json(req.body)
})
req.cookies
cookie-parserミドルウェアを使用すると、このプロパティはリクエストによって送信されたクッキーを含むオブジェクトになります。リクエストにクッキーが含まれていない場合、デフォルトは{}
になります。
// Cookie: name=tj
console.dir(req.cookies.name)
// => 'tj'
クッキーが署名されている場合は、req.signedCookiesを使用する必要があります。
詳細、問題、または懸念事項については、cookie-parserを参照してください。
req.fresh
クライアントのキャッシュでレスポンスがまだ「新しい」場合、true
が返されます。それ以外の場合は、クライアントキャッシュが古くなったため、完全なレスポンスを送信する必要があることを示すためにfalse
が返されます。
エンドツーエンドのリロードリクエストを示すために、クライアントがCache-Control: no-cache
リクエストヘッダーを送信すると、このモジュールはこれらのリクエストの処理を透過的にするためにfalse
を返します。
キャッシュ検証のしくみの詳細については、HTTP/1.1キャッシング仕様を参照してください。
console.dir(req.fresh)
// => true
req.hostname
Host
HTTPヘッダーから派生したホスト名が含まれています。
trust proxy
設定がfalse
と評価されない場合、このプロパティは代わりにX-Forwarded-Host
ヘッダーフィールドから値を取得します。このヘッダーは、クライアントまたはプロキシによって設定できます。
リクエストに複数のX-Forwarded-Host
ヘッダーがある場合、最初のヘッダーの値が使用されます。これには、カンマ区切りの値を持つ単一のヘッダーが含まれ、最初の値が使用されます。
Express v4.17.0より前では、X-Forwarded-Host
に複数の値を含めたり、複数回存在させたりすることはできませんでした。
// Host: "example.com:3000"
console.dir(req.hostname)
// => 'example.com'
req.ip
リクエストのリモートIPアドレスが含まれています。
trust proxy
設定がfalse
と評価されない場合、このプロパティの値はX-Forwarded-For
ヘッダーの最も左側のエントリから導出されます。このヘッダーは、クライアントまたはプロキシによって設定できます。
console.dir(req.ip)
// => '127.0.0.1'
req.ips
trust proxy
設定がfalse
と評価されない場合、このプロパティには、X-Forwarded-For
リクエストヘッダーで指定されたIPアドレスの配列が含まれます。それ以外の場合は、空の配列が含まれます。このヘッダーは、クライアントまたはプロキシによって設定できます。
たとえば、X-Forwarded-For
がclient, proxy1, proxy2
の場合、req.ips
は["client", "proxy1", "proxy2"]
になり、proxy2
は最も下流になります。
req.method
リクエストのHTTPメソッドに対応する文字列が含まれています:GET
、POST
、PUT
など。
req.originalUrl
req.url
はネイティブのExpressプロパティではなく、Nodeのhttpモジュールから継承されています。
このプロパティはreq.url
に似ていますが、内部ルーティングの目的でreq.url
を自由に書き換えることができるように、元のリクエストURLを保持します。たとえば、app.use()の「マウント」機能は、マウントポイントを削除するためにreq.url
を書き換えます。
// GET /search?q=something
console.dir(req.originalUrl)
// => '/search?q=something'
req.originalUrl
はミドルウェアとルーターオブジェクトの両方で利用でき、req.baseUrl
とreq.url
の組み合わせです。次の例を考慮してください
app.use('/admin', function (req, res, next) { // GET 'http://www.example.com/admin/new?sort=desc'
console.dir(req.originalUrl) // '/admin/new?sort=desc'
console.dir(req.baseUrl) // '/admin'
console.dir(req.path) // '/new'
next()
})
req.params
このプロパティは、名前付きルート「パラメーター」にマップされたプロパティを含むオブジェクトです。たとえば、ルート/user/:name
がある場合、「name」プロパティはreq.params.name
として使用できます。このオブジェクトのデフォルトは{}
です。
// GET /user/tj
console.dir(req.params.name)
// => 'tj'
ルート定義に正規表現を使用すると、キャプチャグループはreq.params[n]
を使用して配列で提供されます。ここで、n
はn番目のキャプチャグループです。このルールは、/file/*
のような文字列ルートを使用した名前のないワイルドカード一致に適用されます。
// GET /file/javascripts/jquery.js
console.dir(req.params[0])
// => 'javascripts/jquery.js'
req.params
のキーを変更する必要がある場合は、app.paramハンドラーを使用します。変更は、ルートパスですでに定義されているパラメーターにのみ適用できます。
ミドルウェアまたはルートハンドラーでreq.params
オブジェクトに加えられた変更はすべてリセットされます。
注: Express は req.params
の値を自動的にデコードします (decodeURIComponent
を使用)。
req.path
リクエスト URL のパス部分を含みます。
// example.com/users?sort=desc
console.dir(req.path)
// => '/users'
ミドルウェアから呼び出された場合、マウントポイントは req.path
には含まれません。詳しくは app.use() を参照してください。
req.protocol
リクエストプロトコル文字列(http
または (TLS リクエストの場合は) https
)を含みます。
trust proxy
設定が false
と評価されない場合、このプロパティは X-Forwarded-Proto
ヘッダーフィールドの値(存在する場合)を使用します。このヘッダーはクライアントまたはプロキシによって設定できます。
console.dir(req.protocol)
// => 'http'
req.query
このプロパティは、ルート内の各クエリ文字列パラメータのプロパティを含むオブジェクトです。クエリパーサー が無効に設定されている場合は、空のオブジェクト {}
になります。それ以外の場合は、構成されたクエリパーサーの結果になります。
req.query
の形状はユーザー制御の入力に基づいているため、このオブジェクトのすべてのプロパティと値は信頼できず、信頼する前に検証する必要があります。たとえば、req.query.foo.toString()
は、foo
が存在しない、または文字列でない、あるいは toString
が関数ではなく文字列またはその他のユーザー入力であるなど、複数の方法で失敗する可能性があります。
このプロパティの値は、アプリケーションのニーズに合わせて動作するように クエリパーサーアプリケーション設定 で構成できます。非常に人気のあるクエリ文字列パーサーは qs
モジュールであり、これがデフォルトで使用されます。qs
モジュールは多くの設定で高度に構成可能であり、デフォルトとは異なる設定を使用して req.query
を設定することが望ましい場合があります。
var qs = require('qs')
app.set('query parser', function (str) {
return qs.parse(str, { /* custom options */ })
})
その他のカスタマイズオプションについては、クエリパーサーアプリケーション設定のドキュメントを確認してください。
req.res
このプロパティは、このリクエストオブジェクトに関連する レスポンスオブジェクトへの参照を保持します。
req.route
現在一致しているルート(文字列)を含みます。例:
app.get('/user/:id?', function userIdHandler (req, res) {
console.log(req.route)
res.send('GET')
})
前のスニペットからの出力例
{ path: '/user/:id?',
stack:
[ { handle: [Function: userIdHandler],
name: 'userIdHandler',
params: undefined,
path: undefined,
keys: [],
regexp: /^\/?$/i,
method: 'get' } ],
methods: { get: true } }
req.secure
TLS 接続が確立されている場合は true であるブール値プロパティ。以下と同等です。
console.dir(req.protocol === 'https')
// => true
req.signedCookies
cookie-parser ミドルウェアを使用すると、このプロパティには、リクエストによって送信された署名付きクッキーが、署名なしで、すぐに使用できる状態で含まれます。署名付きクッキーは、開発者の意図を示すために別のオブジェクトに存在します。そうでないと、悪意のある攻撃が req.cookie
の値(偽造が容易)に対して行われる可能性があります。クッキーに署名しても、クッキーが「隠される」または暗号化されるわけではないことに注意してください。単に改ざんを防ぐだけです(署名に使用される秘密鍵はプライベートであるため)。
署名付きクッキーが送信されない場合、プロパティはデフォルトで {}
になります。
// Cookie: user=tobi.CP7AWaXDfAKIRfH49dQzKJx7sKzzSoPq7/AcBBRVwlI3
console.dir(req.signedCookies.user)
// => 'tobi'
詳細、問題、または懸念事項については、cookie-parserを参照してください。
req.stale
リクエストが「古い」かどうかを示し、req.fresh
の反対です。詳細については、req.fresh を参照してください。
console.dir(req.stale)
// => true
req.subdomains
リクエストのドメイン名のサブドメインの配列。
// Host: "tobi.ferrets.example.com"
console.dir(req.subdomains)
// => ['ferrets', 'tobi']
デフォルトが 2 のアプリケーションプロパティ subdomain offset
は、サブドメインセグメントの開始を決定するために使用されます。この動作を変更するには、app.set を使用して値を変更します。
req.xhr
リクエストの X-Requested-With
ヘッダーフィールドが “XMLHttpRequest” である場合、つまり、リクエストが jQuery などのクライアントライブラリによって発行された場合、true
であるブール値プロパティ。
console.dir(req.xhr)
// => true
メソッド
req.accepts(types)
リクエストの Accept
HTTP ヘッダーフィールドに基づいて、指定されたコンテンツタイプが許容可能かどうかを確認します。このメソッドは、最適な一致を返します。または、指定されたコンテンツタイプがどれも許容できない場合は false
を返します (この場合、アプリケーションは 406 "Not Acceptable"
で応答する必要があります)。
type
の値は、単一の MIME タイプ文字列("application/json" など)、"json" などの拡張子名、カンマ区切りのリスト、または配列にできます。リストまたは配列の場合、メソッドは (もしあれば) *最適な* 一致を返します。
// Accept: text/html
req.accepts('html')
// => "html"
// Accept: text/*, application/json
req.accepts('html')
// => "html"
req.accepts('text/html')
// => "text/html"
req.accepts(['json', 'text'])
// => "json"
req.accepts('application/json')
// => "application/json"
// Accept: text/*, application/json
req.accepts('image/png')
req.accepts('png')
// => false
// Accept: text/*;q=.5, application/json
req.accepts(['html', 'json'])
// => "json"
詳細、問題、または懸念がある場合は、accepts を参照してください。
req.acceptsCharsets(charset [, ...])
リクエストの Accept-Charset
HTTP ヘッダーフィールドに基づいて、指定された文字セットの最初に受け入れられた文字セットを返します。指定された文字セットのいずれも受け入れられない場合は、false
を返します。
詳細、問題、または懸念がある場合は、accepts を参照してください。
req.acceptsEncodings(encoding [, ...])
リクエストの Accept-Encoding
HTTP ヘッダーフィールドに基づいて、指定されたエンコーディングの最初に受け入れられたエンコーディングを返します。指定されたエンコーディングのいずれも受け入れられない場合は、false
を返します。
詳細、問題、または懸念がある場合は、accepts を参照してください。
req.acceptsLanguages([lang, ...])
リクエストの Accept-Language
HTTP ヘッダーフィールドに基づいて、指定された言語の最初に受け入れられた言語を返します。指定された言語のいずれも受け入れられない場合は、false
を返します。
lang
引数が指定されていない場合、req.acceptsLanguages()
は、HTTP Accept-Language
ヘッダーからすべての言語を Array
として返します。
詳細、問題、または懸念がある場合は、accepts を参照してください。
Express (4.x) ソース: request.js 179行目
Accepts (1.3) ソース: index.js 195行目
req.get(field)
指定された HTTP リクエストヘッダーフィールドを返します (大文字と小文字を区別しない一致)。Referrer
フィールドと Referer
フィールドは交換可能です。
req.get('Content-Type')
// => "text/plain"
req.get('content-type')
// => "text/plain"
req.get('Something')
// => undefined
req.header(field)
としてエイリアスされます。
req.is(type)
着信リクエストの "Content-Type" HTTP ヘッダーフィールドが type
パラメータで指定された MIME タイプと一致する場合、一致するコンテンツタイプを返します。リクエストに本文がない場合は、null
を返します。それ以外の場合は false
を返します。
// With Content-Type: text/html; charset=utf-8
req.is('html')
// => 'html'
req.is('text/html')
// => 'text/html'
req.is('text/*')
// => 'text/*'
// When Content-Type is application/json
req.is('json')
// => 'json'
req.is('application/json')
// => 'application/json'
req.is('application/*')
// => 'application/*'
req.is('html')
// => false
詳細、問題、または懸念がある場合は、type-is を参照してください。
req.param(name [, defaultValue])
非推奨です。必要に応じて、req.params
、req.body
、または req.query
を使用してください。
パラメータ name
が存在する場合、その値を返します。
// ?name=tobi
req.param('name')
// => "tobi"
// POST name=tobi
req.param('name')
// => "tobi"
// /user/tobi for /user/:name
req.param('name')
// => "tobi"
ルックアップは次の順序で実行されます
req.params
req.body
req.query
オプションで、パラメータがいずれのリクエストオブジェクトにも見つからない場合に、デフォルト値を設定するために defaultValue
を指定できます。
各オブジェクトからの入力を真に受け入れる場合を除き、明確にするために req.body
、req.params
、および req.query
への直接アクセスが推奨されます。
req.param()
を予測どおりに動作させるには、ボディ解析ミドルウェアをロードする必要があります。詳細については、req.body を参照してください。
req.range(size[, options])
Range
ヘッダーパーサー。
size
パラメータは、リソースの最大サイズです。
options
パラメータは、次のプロパティを持つことができるオブジェクトです。
プロパティ | 型 | 説明 |
---|---|---|
combine |
Boolean | 重複および隣接する範囲を結合する必要があるかどうかを指定します。デフォルトは false です。true の場合、範囲は結合され、ヘッダーで指定された場合と同様に返されます。 |
範囲の配列が返されるか、解析エラーを示す負の数が返されます。
-2
は、不正なヘッダー文字列を示します-1
は、満たされない範囲を示します
// parse header from request
var range = req.range(1000)
// the type of the range
if (range.type === 'bytes') {
// the ranges
range.forEach(function (r) {
// do something with r.start and r.end
})
}
レスポンス
res
オブジェクトは、Express アプリが HTTP リクエストを受け取ったときに送信する HTTP レスポンスを表します。
このドキュメントおよび慣例では、オブジェクトは常に res
(および HTTP リクエストは req
) と呼ばれますが、実際の名前は、作業中のコールバック関数のパラメータによって決定されます。
例:
app.get('/user/:id', function (req, res) {
res.send('user ' + req.params.id)
})
ただし、次のようにすることもできます
app.get('/user/:id', function (request, response) {
response.send('user ' + request.params.id)
})
res
オブジェクトは Node 自身のレスポンスオブジェクトの拡張バージョンであり、すべての 組み込みフィールドとメソッドをサポートします。
プロパティ
res.app
このプロパティは、ミドルウェアを使用しているExpressアプリケーションのインスタンスへの参照を保持します。
res.app
は、リクエストオブジェクトの req.app プロパティと同じです。
res.headersSent
アプリがレスポンスの HTTP ヘッダーを送信したかどうかを示すブール値プロパティ。
app.get('/', function (req, res) {
console.dir(res.headersSent) // false
res.send('OK')
console.dir(res.headersSent) // true
})
res.locals
res.render でレンダリングされたテンプレートでアクセスできる変数を設定するには、このプロパティを使用します。res.locals
に設定された変数は、単一のリクエスト/レスポンスサイクル内で利用でき、リクエスト間で共有されません。
locals
オブジェクトは、レスポンスをレンダリングするためにビューエンジンで使用されます。オブジェクトキーは特に機密性が高く、ビューエンジンの操作に影響を与えたり、クロスサイトスクリプティングへのパスを提供したりする可能性があるため、ユーザーが制御する入力を含めないでください。追加の考慮事項については、使用されているビューエンジンのドキュメントを参照してください。
リクエスト間のテンプレートレンダリングで使用するためにローカル変数を保持するには、代わりに app.locals を使用します。
このプロパティは、リクエストパス名、認証されたユーザー、ユーザー設定などのリクエストレベルの情報を、アプリケーション内でレンダリングされたテンプレートに公開するのに役立ちます。
app.use(function (req, res, next) {
// Make `user` and `authenticated` available in templates
res.locals.user = req.user
res.locals.authenticated = !req.user.anonymous
next()
})
メソッド
res.append(field [, value])
res.append()
は Express v4.11.0 以降でサポートされています
指定された value
を HTTP レスポンスヘッダー field
に追加します。ヘッダーがまだ設定されていない場合は、指定された値でヘッダーを作成します。value
パラメータは、文字列または配列にすることができます。
注: res.append()
の後に res.set()
を呼び出すと、以前に設定されたヘッダー値がリセットされます。
res.append('Link', ['<https://127.0.0.1/>', '<https://127.0.0.1:3000/>'])
res.append('Set-Cookie', 'foo=bar; Path=/; HttpOnly')
res.append('Warning', '199 Miscellaneous warning')
res.attachment([filename])
HTTP レスポンスの Content-Disposition
ヘッダーフィールドを “attachment” に設定します。filename
が指定されている場合、res.type()
を介して拡張子名に基づいて Content-Type を設定し、Content-Disposition
"filename=" パラメータを設定します。
res.attachment()
// Content-Disposition: attachment
res.attachment('path/to/logo.png')
// Content-Disposition: attachment; filename="logo.png"
// Content-Type: image/png
res.cookie(name, value [, options])
クッキー name
を value
に設定します。value
パラメータは、JSON に変換された文字列またはオブジェクトにすることができます。
options
パラメータは、次のプロパティを持つことができるオブジェクトです。
プロパティ | 型 | 説明 |
---|---|---|
domain |
String | クッキーのドメイン名。デフォルトはアプリのドメイン名です。 |
encode |
関数 | クッキー値のエンコードに使用される同期関数。デフォルトは encodeURIComponent です。 |
expires |
日付 | クッキーの GMT での有効期限。指定しない場合、または 0 に設定した場合、セッションクッキーを作成します。 |
httpOnly |
Boolean | Web サーバーのみがアクセスできるようにクッキーにフラグを設定します。 |
maxAge |
Number | 現在の時刻からのミリ秒単位で有効期限を設定する便利なオプション。 |
path |
String | クッキーのパス。デフォルトは "/" です。 |
partitioned |
Boolean | クッキーをパーティション化されたストレージを使用して格納する必要があることを示します。詳細については、クッキーの独立したパーティション化された状態 (CHIPS) を参照してください。 |
priority |
String | 「Priority」Set-Cookie 属性の値。 |
secure |
Boolean | HTTPS でのみ使用するようにクッキーをマークします。 |
signed |
Boolean | クッキーに署名する必要があるかどうかを示します。 |
sameSite |
ブール値または文字列 | 「SameSite」Set-Cookie 属性の値。詳細については、https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-00#section-4.1.1 を参照してください。 |
res.cookie()
が行うことは、提供されたオプションを使用して HTTP Set-Cookie
ヘッダーを設定することだけです。指定されていないオプションはすべて、RFC 6265 で述べられている値にデフォルト設定されます。
例:
res.cookie('name', 'tobi', { domain: '.example.com', path: '/admin', secure: true })
res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true })
res.cookie
を複数回呼び出すことで、単一のレスポンスで複数のクッキーを設定できます。例:
res
.status(201)
.cookie('access_token', 'Bearer ' + token, {
expires: new Date(Date.now() + 8 * 3600000) // cookie will be removed after 8 hours
})
.cookie('test', 'test')
.redirect(301, '/admin')
encode
オプションを使用すると、クッキー値のエンコードに使用する関数を選択できます。非同期関数はサポートしていません。
使用例: 組織内の別のサイトにドメイン全体のクッキーを設定する必要がある場合。この別のサイト(管理下にはない)は、URIエンコードされたクッキー値を使用していません。
// Default encoding
res.cookie('some_cross_domain_cookie', 'http://mysubdomain.example.com', { domain: 'example.com' })
// Result: 'some_cross_domain_cookie=http%3A%2F%2Fmysubdomain.example.com; Domain=example.com; Path=/'
// Custom encoding
res.cookie('some_cross_domain_cookie', 'http://mysubdomain.example.com', { domain: 'example.com', encode: String })
// Result: 'some_cross_domain_cookie=http://mysubdomain.example.com; Domain=example.com; Path=/;'
maxAge
オプションは、現在の時刻からの相対的なミリ秒単位で "expires" を設定するための便利なオプションです。以下は、上記の2番目の例と同等です。
res.cookie('rememberme', '1', { maxAge: 900000, httpOnly: true })
value
パラメータとしてオブジェクトを渡すことができます。その場合、JSONとしてシリアライズされ、bodyParser()
ミドルウェアによって解析されます。
res.cookie('cart', { items: [1, 2, 3] })
res.cookie('cart', { items: [1, 2, 3] }, { maxAge: 900000 })
cookie-parserミドルウェアを使用する場合、このメソッドは署名付きクッキーもサポートします。signed
オプションをtrue
に設定するだけです。すると、res.cookie()
はcookieParser(secret)
に渡された秘密鍵を使用して値を署名します。
res.cookie('name', 'tobi', { signed: true })
後で、この値にreq.signedCookieオブジェクトを通じてアクセスできます。
res.clearCookie(name [, options])
name
で指定されたクッキーをクリアします。options
オブジェクトの詳細については、res.cookie()を参照してください。
Webブラウザおよびその他の準拠クライアントは、指定されたoptions
がres.cookie()に渡されたものと同一である場合(expires
およびmaxAge
を除く)にのみクッキーをクリアします。
res.cookie('name', 'tobi', { path: '/admin' })
res.clearCookie('name', { path: '/admin' })
res.download(path [, filename] [, options] [, fn])
path
にあるファイルを「添付ファイル」として転送します。通常、ブラウザはユーザーにダウンロードを促します。デフォルトでは、Content-Disposition
ヘッダーの「filename=」パラメータはpath
引数から派生しますが、filename
パラメータで上書きできます。path
が相対パスの場合、プロセスの現在の作業ディレクトリまたは、提供されている場合はroot
オプションに基づいて決定されます。
このAPIは、実行中のファイルシステム上のデータへのアクセスを提供します。ユーザー入力が含まれている場合に、(a) path
引数が構築された方法が安全であることを確認するか、(b) アクセスを制限するためのディレクトリの絶対パスをroot
オプションに設定してください。
root
オプションが提供されている場合、Expressはpath
として提供された相対パスが、与えられたroot
オプション内で解決されることを検証します。
次の表に、options
パラメータの詳細を示します。
オプションのoptions
引数は、Express v4.16.0以降でサポートされています。
プロパティ | 説明 | デフォルト | 可用性 |
---|---|---|---|
maxAge |
Cache-Control ヘッダーのmax-ageプロパティをミリ秒単位またはms形式の文字列で設定します。 |
0 | 4.16+ |
root |
相対ファイル名のルートディレクトリ。 | 4.18+ | |
lastModified |
Last-Modified ヘッダーをOS上のファイルの最終更新日に設定します。無効にするにはfalse を設定します。 |
有効 | 4.16+ |
headers |
ファイルとともに提供するHTTPヘッダーを含むオブジェクト。ヘッダーContent-Disposition はfilename 引数によって上書きされます。 |
4.16+ | |
dotfiles |
ドットファイルを処理するためのオプション。指定可能な値は "allow"、"deny"、"ignore" です。 | “ignore” | 4.16+ |
acceptRanges |
範囲リクエストの受け入れを有効または無効にします。 | true |
4.16+ |
cacheControl |
Cache-Control 応答ヘッダーの設定を有効または無効にします。 |
true |
4.16+ |
immutable |
Cache-Control 応答ヘッダーで immutable ディレクティブを有効または無効にします。有効にした場合、キャッシュを有効にするために maxAge オプションも指定する必要があります。immutable ディレクティブは、maxAge オプションの有効期間中に、サポートされているクライアントがファイルが変更されたかどうかを確認するための条件付きリクエストを作成するのを防ぎます。 |
false |
4.16+ |
このメソッドは、転送が完了したとき、またはエラーが発生したときに、コールバック関数fn(err)
を呼び出します。コールバック関数が指定され、エラーが発生した場合、コールバック関数は、リクエスト-レスポンスサイクルを終了するか、次のルートに制御を渡すことで、明示的にレスポンス処理を処理する必要があります。
res.download('/report-12345.pdf')
res.download('/report-12345.pdf', 'report.pdf')
res.download('/report-12345.pdf', 'report.pdf', function (err) {
if (err) {
// Handle error, but keep in mind the response may be partially-sent
// so check res.headersSent
} else {
// decrement a download credit, etc.
}
})
res.end([data] [, encoding])
レスポンス処理を終了します。このメソッドは実際にはNodeコア、具体的にはhttp.ServerResponseのresponse.end()メソッドから来ています。
データを伴わずにレスポンスをすばやく終了するために使用します。データで応答する必要がある場合は、代わりにres.send()やres.json()などのメソッドを使用してください。
res.end()
res.status(404).end()
res.format(object)
リクエストオブジェクトに存在する場合、Accept
HTTPヘッダーでコンテンツネゴシエーションを実行します。品質値で順序付けられた許容可能なタイプに基づいて、リクエストのハンドラーを選択するためにreq.accepts()を使用します。ヘッダーが指定されていない場合、最初のコールバックが呼び出されます。一致が見つからない場合、サーバーは406 "Not Acceptable" で応答するか、default
コールバックを呼び出します。
コールバックが選択されると、Content-Type
応答ヘッダーが設定されます。ただし、res.set()
やres.type()
などのメソッドを使用して、コールバック内でこれを変更できます。
次の例では、Accept
ヘッダーフィールドが "application/json" または "*/json" に設定されている場合、{ "message": "hey" }
で応答します(ただし、"*/ *" の場合は、応答は "hey" になります)。
res.format({
'text/plain': function () {
res.send('hey')
},
'text/html': function () {
res.send('<p>hey</p>')
},
'application/json': function () {
res.send({ message: 'hey' })
},
default: function () {
// log the request and respond with 406
res.status(406).send('Not Acceptable')
}
})
正規化されたMIMEタイプに加えて、これらのタイプにマッピングされた拡張子名を使用して、少し冗長ではない実装を行うこともできます。
res.format({
text: function () {
res.send('hey')
},
html: function () {
res.send('<p>hey</p>')
},
json: function () {
res.send({ message: 'hey' })
}
})
res.get(field)
field
で指定されたHTTP応答ヘッダーを返します。一致は大文字と小文字を区別しません。
res.get('Content-Type')
// => "text/plain"
res.json([body])
JSON応答を送信します。このメソッドは、JSON.stringify()を使用してJSON文字列に変換されたパラメータである(正しいcontent-typeを持つ)レスポンスを送信します。
パラメータは、オブジェクト、配列、文字列、ブール値、数値、またはnullなどの任意のJSON型にすることができ、他の値をJSONに変換するためにも使用できます。
res.json(null)
res.json({ user: 'tobi' })
res.status(500).json({ error: 'message' })
res.jsonp([body])
JSONPサポート付きのJSON応答を送信します。このメソッドは、JSONPコールバックサポートを選択することを除いて、res.json()
と同じです。
res.jsonp(null)
// => callback(null)
res.jsonp({ user: 'tobi' })
// => callback({ "user": "tobi" })
res.status(500).jsonp({ error: 'message' })
// => callback({ "error": "message" })
デフォルトでは、JSONPコールバック名は単純にcallback
です。jsonp callback name設定でこれを上書きします。
以下は、同じコードを使用したJSONP応答の例です
// ?callback=foo
res.jsonp({ user: 'tobi' })
// => foo({ "user": "tobi" })
app.set('jsonp callback name', 'cb')
// ?cb=foo
res.status(500).jsonp({ error: 'message' })
// => foo({ "error": "message" })
res.links(links)
パラメータのプロパティとして提供されたlinks
を結合して、応答のLink
HTTPヘッダーフィールドを設定します。
たとえば、次の呼び出しは
res.links({
next: 'http://api.example.com/users?page=2',
last: 'http://api.example.com/users?page=5'
})
次の結果が得られます
Link: <http://api.example.com/users?page=2>; rel="next",
<http://api.example.com/users?page=5>; rel="last"
res.location(path)
応答のLocation
HTTPヘッダーを指定されたpath
パラメータに設定します。
res.location('/foo/bar')
res.location('http://example.com')
res.location('back')
"back"のpath
値には特別な意味があり、リクエストのReferer
ヘッダーで指定されたURLを参照します。Referer
ヘッダーが指定されていない場合は、"/"を参照します。
URLをエンコードした後(まだエンコードされていない場合)、Expressは指定されたURLを検証せずにLocation
ヘッダーでブラウザに渡します。
ブラウザは、現在のURLまたは参照URL、およびLocation
ヘッダーで指定されたURLから目的のURLを導き出し、それに応じてユーザーをリダイレクトする責任を負います。
res.redirect([status,] path)
指定されたpath
から派生したURLに、指定されたstatus
(HTTPステータスコードに対応する正の整数)を使用してリダイレクトします。指定しない場合、status
はデフォルトで "302 Found" になります。
res.redirect('/foo/bar')
res.redirect('http://example.com')
res.redirect(301, 'http://example.com')
res.redirect('../login')
リダイレクトは、別のサイトにリダイレクトするための完全修飾URLにすることができます。
res.redirect('http://google.com')
リダイレクトは、ホスト名のルートに対して相対的に行うことができます。たとえば、アプリケーションがhttp://example.com/admin/post/new
にある場合、以下はURL http://example.com/admin
にリダイレクトされます。
res.redirect('/admin')
リダイレクトは、現在のURLに対して相対的に行うことができます。たとえば、http://example.com/blog/admin/
(末尾のスラッシュに注意)から、以下はURL http://example.com/blog/admin/post/new
にリダイレクトされます。
res.redirect('post/new')
http://example.com/blog/admin
(末尾のスラッシュなし)からpost/new
にリダイレクトすると、http://example.com/blog/post/new
にリダイレクトされます。
上記のような動作がわかりにくい場合は、パスセグメントをディレクトリ(末尾にスラッシュ付き)とファイルと考えると、理解できるようになります。
パス相対リダイレクトも可能です。http://example.com/admin/post/new
にいた場合、以下はhttp://example.com/admin/post
にリダイレクトされます。
res.redirect('..')
back
リダイレクトは、リクエストをリファラにリダイレクトし、リファラがない場合はデフォルトで/
になります。
res.redirect('back')
res.render(view [, locals] [, callback])
view
をレンダリングし、レンダリングされたHTML文字列をクライアントに送信します。オプションのパラメータ
locals
、ビューのローカル変数を定義するプロパティを持つオブジェクト。callback
、コールバック関数。提供された場合、このメソッドは発生する可能性のあるエラーとレンダリングされた文字列の両方を返しますが、自動応答は実行しません。エラーが発生した場合、このメソッドは内部的にnext(err)
を呼び出します。
view
引数は、レンダリングするビューファイルのファイルパスである文字列です。これは絶対パス、またはviews
設定に対する相対パスにすることができます。パスにファイル拡張子が含まれていない場合、view engine
設定によってファイル拡張子が決定されます。パスにファイル拡張子が含まれている場合、Expressは指定されたテンプレートエンジンのモジュールを(require()
経由で)ロードし、ロードされたモジュールの__express
関数を使用してレンダリングします。
詳細については、Expressでのテンプレートエンジンの使用を参照してください。
view
引数は、ディスクからファイルを読み取ったり、Node.jsモジュールを評価したりするなどのファイルシステム操作を実行するため、セキュリティ上の理由からエンドユーザーからの入力を含めるべきではありません。
locals
オブジェクトは、レスポンスをレンダリングするためにビューエンジンで使用されます。オブジェクトキーは特に機密性が高く、ビューエンジンの操作に影響を与えたり、クロスサイトスクリプティングへのパスを提供したりする可能性があるため、ユーザーが制御する入力を含めないでください。追加の考慮事項については、使用されているビューエンジンのドキュメントを参照してください。
ローカル変数cache
は、ビューのキャッシュを有効にします。開発中にビューをキャッシュするには、true
に設定します。本番環境では、ビューのキャッシュはデフォルトで有効になっています。
// send the rendered view to the client
res.render('index')
// if a callback is specified, the rendered HTML string has to be sent explicitly
res.render('index', function (err, html) {
res.send(html)
})
// pass a local variable to the view
res.render('user', { name: 'Tobi' }, function (err, html) {
// ...
})
res.req
このプロパティは、この応答オブジェクトに関連するリクエストオブジェクトへの参照を保持します。res.send([body])
HTTP応答を送信します。
body
パラメータには、Buffer
オブジェクト、String
、オブジェクト、Boolean
、またはArray
を指定できます。例:
res.send(Buffer.from('whoop'))
res.send({ some: 'json' })
res.send('<p>some html</p>')
res.status(404).send('Sorry, we cannot find that!')
res.status(500).send({ error: 'something blew up' })
このメソッドは、単純な非ストリーミング応答のために多くの便利なタスクを実行します。たとえば、自動的にContent-Length
HTTP応答ヘッダーフィールドを割り当て(以前に定義されていない場合)、自動HEADおよびHTTPキャッシュの新鮮度サポートを提供します。
パラメータがBuffer
オブジェクトの場合、このメソッドは、以下に示すように以前に定義されていない限り、Content-Type
応答ヘッダーフィールドを "application/octet-stream" に設定します。
res.set('Content-Type', 'text/html')
res.send(Buffer.from('<p>some html</p>'))
パラメータがString
の場合、メソッドはContent-Type
を "text/html" に設定します。
res.send('<p>some html</p>')
パラメータがArray
またはObject
の場合、ExpressはJSON表現で応答します。
res.send({ user: 'tobi' })
res.send([1, 2, 3])
res.sendFile(path [, options] [, fn])
res.sendFile()
はExpress v4.8.0以降でサポートされています。
指定されたpath
にあるファイルを転送します。ファイル名の拡張子に基づいてContent-Type
応答HTTPヘッダーフィールドを設定します。オプションオブジェクトでroot
オプションが設定されていない限り、path
はファイルへの絶対パスである必要があります。
このAPIは、実行中のファイルシステム上のデータへのアクセスを提供します。ユーザー入力が含まれている場合に、(a) path
引数が絶対パスに構築された方法が安全であることを確認するか、(b) アクセスを制限するためのディレクトリの絶対パスをroot
オプションに設定してください。
root
オプションが提供されている場合、path
引数は..
を含め、相対パスにすることができます。Expressは、path
として提供された相対パスが、指定されたroot
オプション内で解決されることを検証します。
次の表に、options
パラメータの詳細を示します。
プロパティ | 説明 | デフォルト | 可用性 |
---|---|---|---|
maxAge |
Cache-Control ヘッダーのmax-ageプロパティをミリ秒単位またはms形式の文字列で設定します。 |
0 | |
root |
相対ファイル名のルートディレクトリ。 | ||
lastModified |
Last-Modified ヘッダーをOS上のファイルの最終更新日に設定します。無効にするにはfalse を設定します。 |
有効 | 4.9.0+ |
headers |
ファイルとともに送信する HTTP ヘッダーを含むオブジェクト。 | ||
dotfiles |
ドットファイルを処理するためのオプション。指定可能な値は "allow"、"deny"、"ignore" です。 | “ignore” | |
acceptRanges |
範囲リクエストの受け入れを有効または無効にします。 | true |
4.14+ |
cacheControl |
Cache-Control 応答ヘッダーの設定を有効または無効にします。 |
true |
4.14+ |
immutable |
Cache-Control 応答ヘッダーで immutable ディレクティブを有効または無効にします。有効にした場合、キャッシュを有効にするために maxAge オプションも指定する必要があります。immutable ディレクティブは、maxAge オプションの有効期間中に、サポートされているクライアントがファイルが変更されたかどうかを確認するための条件付きリクエストを作成するのを防ぎます。 |
false |
4.16+ |
このメソッドは、転送が完了したとき、またはエラーが発生したときに、コールバック関数fn(err)
を呼び出します。コールバック関数が指定され、エラーが発生した場合、コールバック関数は、リクエスト-レスポンスサイクルを終了するか、次のルートに制御を渡すことで、明示的にレスポンス処理を処理する必要があります。
以下は、すべての引数を使用して res.sendFile
を使用する例です。
app.get('/file/:name', function (req, res, next) {
var options = {
root: path.join(__dirname, 'public'),
dotfiles: 'deny',
headers: {
'x-timestamp': Date.now(),
'x-sent': true
}
}
var fileName = req.params.name
res.sendFile(fileName, options, function (err) {
if (err) {
next(err)
} else {
console.log('Sent:', fileName)
}
})
})
以下の例は、res.sendFile
を使用して、ファイル配信をきめ細かく制御する方法を示しています。
app.get('/user/:uid/photos/:file', function (req, res) {
var uid = req.params.uid
var file = req.params.file
req.user.mayViewFilesFrom(uid, function (yes) {
if (yes) {
res.sendFile('/uploads/' + uid + '/' + file)
} else {
res.status(403).send("Sorry! You can't see that.")
}
})
})
詳細情報や問題点、懸念事項がある場合は、send を参照してください。
res.sendStatus(statusCode)
レスポンスの HTTP ステータスコードを statusCode
に設定し、登録されているステータスメッセージをテキストレスポンスボディとして送信します。不明なステータスコードが指定された場合、レスポンスボディはコード番号のみになります。
res.sendStatus(404)
Node.js の一部のバージョンでは、res.statusCode
が無効な HTTP ステータスコード(100
〜599
の範囲外)に設定されている場合、例外がスローされます。使用している Node.js バージョンの HTTP サーバーのドキュメントを参照してください。
res.set(field [, value])
レスポンスの HTTP ヘッダー field
を value
に設定します。複数のフィールドを一度に設定するには、パラメーターとしてオブジェクトを渡します。
res.set('Content-Type', 'text/plain')
res.set({
'Content-Type': 'text/plain',
'Content-Length': '123',
ETag: '12345'
})
res.header(field [, value])
というエイリアスもあります。
res.status(code)
レスポンスの HTTP ステータスを設定します。これは Node の response.statusCode のチェーナブルエイリアスです。
res.status(403).end()
res.status(400).send('Bad Request')
res.status(404).sendFile('/absolute/path/to/404.png')
res.type(type)
指定された type
によって決定される MIME タイプに Content-Type
HTTP ヘッダーを設定します。type
に "/" 文字が含まれている場合は、Content-Type
を type
の正確な値に設定します。それ以外の場合は、ファイル拡張子と見なされ、MIME タイプは express.static.mime.lookup()
メソッドを使用してマッピングで検索されます。
res.type('.html')
// => 'text/html'
res.type('html')
// => 'text/html'
res.type('json')
// => 'application/json'
res.type('application/json')
// => 'application/json'
res.type('png')
// => 'image/png'
res.vary(field)
Vary
レスポンスヘッダーに、まだない場合はフィールドを追加します。
res.vary('User-Agent').render('docs')
ルーター
router
オブジェクトは、ミドルウェアとルートの独立したインスタンスです。これは、ミドルウェアとルーティング機能のみを実行できる「ミニアプリケーション」と考えることができます。すべての Express アプリケーションには、組み込みのアプリルーターがあります。
ルーター自体はミドルウェアのように動作するため、app.use() の引数として、または別のルーターの use() メソッドの引数として使用できます。
トップレベルの express
オブジェクトには、新しい router
オブジェクトを作成する Router() メソッドがあります。
ルーターオブジェクトを作成したら、アプリケーションと同じように、ミドルウェアと HTTP メソッドルート(get
、put
、post
など)を追加できます。例:
// invoked for any requests passed to this router
router.use(function (req, res, next) {
// .. some logic here .. like any other middleware
next()
})
// will handle any request that ends in /events
// depends on where the router is "use()'d"
router.get('/events', function (req, res, next) {
// ..
})
このようにして、ルートをファイルやミニアプリに分離して、特定のルート URL にルーターを使用できます。
// only requests to /calendar/* will be sent to our "router"
app.use('/calendar', router)
メソッド
router.all(path, [callback, ...] callback)
このメソッドは、すべての HTTP メソッド(動詞)に一致する点を除いて、router.METHOD()
メソッドとまったく同じです。
このメソッドは、特定のパスプレフィックスまたは任意の照合に対する「グローバル」ロジックをマッピングする場合に非常に便利です。たとえば、他のすべてのルート定義の先頭に次のルートを配置した場合、その時点からのすべてのルートで認証が必要になり、ユーザーが自動的にロードされます。これらのコールバックはエンドポイントとして機能する必要はないことに注意してください。loadUser
はタスクを実行してから、next()
を呼び出して後続のルートとの照合を継続できます。
router.all('*', requireAuthentication, loadUser)
または、同等の
router.all('*', requireAuthentication)
router.all('*', loadUser)
もう 1 つの例は、ホワイトリストに登録された「グローバル」機能です。ここでの例は以前とよく似ていますが、「/api」で始まるパスのみを制限します。
router.all('/api/*', requireAuthentication)
router.METHOD(path, [callback, ...] callback)
router.METHOD()
メソッドは、Express のルーティング機能を提供します。ここで、METHOD は HTTP メソッド(GET、PUT、POST など)の 1 つであり、小文字で指定します。したがって、実際のメソッドは router.get()
、router.post()
、router.put()
などです。
router.get()
関数は、パスに対して router.head()
が router.get()
の前に呼び出されなかった場合、HTTP GET
メソッドに加えて HTTP HEAD
メソッドに対しても自動的に呼び出されます。
複数のコールバックを指定でき、すべて同じように扱われ、ミドルウェアとまったく同じように動作します。ただし、これらのコールバックは next('route')
を呼び出して、残りのルートコールバックをバイパスする場合があります。このメカニズムを使用して、ルートの事前条件を実行し、一致したルートの処理を進める理由がない場合に後続のルートに制御を渡すことができます。
次のスニペットは、可能な限り最も単純なルート定義を示しています。Express は、パス文字列を正規表現に変換し、着信リクエストのマッチングに内部的に使用します。クエリ文字列は、これらのマッチングを実行する際には考慮されません。たとえば、「GET /」は次のルートに一致し、「GET /?name=tobi」も同様です。
router.get('/', function (req, res) {
res.send('hello world')
})
また、正規表現を使用することもできます。これは、非常に具体的な制約がある場合に役立ちます。たとえば、次のものは「GET /commits/71dbb9c」と「GET /commits/71dbb9c..4c084f9」の両方に一致します。
router.get(/^\/commits\/(\w+)(?:\.\.(\w+))?$/, function (req, res) {
var from = req.params[0]
var to = req.params[1] || 'HEAD'
res.send('commit range ' + from + '..' + to)
})
router.param(name, callback)
ルートパラメーターにコールバックトリガーを追加します。ここで、name
はパラメーターの名前であり、callback
はコールバック関数です。name
は技術的にはオプションですが、このメソッドを省略して使用することは Express v4.11.0 以降では非推奨となっています(下記を参照)。
コールバック関数のパラメーターは次のとおりです。
req
、リクエストオブジェクト。res
、レスポンスオブジェクト。next
、次のミドルウェア関数を示します。name
パラメーターの値。- パラメーターの名前。
app.param()
とは異なり、router.param()
はルートパラメーターの配列を受け入れません。
たとえば、ルートパスに:user
が存在する場合、ユーザーロードロジックをマッピングして、req.user
をルートに自動的に提供したり、パラメーター入力の検証を実行したりできます。
router.param('user', function (req, res, next, id) {
// try to get the user details from the User model and attach it to the request object
User.find(id, function (err, user) {
if (err) {
next(err)
} else if (user) {
req.user = user
next()
} else {
next(new Error('failed to load user'))
}
})
})
パラメーターコールバック関数は、定義されているルーターにローカルです。それらは、マウントされたアプリまたはルーターによって継承されません。したがって、router
で定義されたパラメーターコールバックは、router
ルートで定義されたルートパラメーターでのみトリガーされます。
パラメーターコールバックは、次の例に示すように、パラメーターが複数のルートで一致した場合でも、リクエスト/レスポンスサイクルで 1 回だけ呼び出されます。
router.param('id', function (req, res, next, id) {
console.log('CALLED ONLY ONCE')
next()
})
router.get('/user/:id', function (req, res, next) {
console.log('although this matches')
next()
})
router.get('/user/:id', function (req, res) {
console.log('and this matches too')
res.end()
})
GET /user/42
では、以下が出力されます
CALLED ONLY ONCE
although this matches
and this matches too
次のセクションでは、v4.11.0 以降で非推奨となっている router.param(callback)
について説明します。
router.param(name, callback)
メソッドの動作は、関数のみを router.param()
に渡すことで完全に変更できます。この関数は、router.param(name, callback)
がどのように動作するかを示すカスタム実装であり、2 つのパラメーターを受け取り、ミドルウェアを返す必要があります。
この関数の最初のパラメーターは、キャプチャする必要があるURLパラメーターの名前であり、2番目のパラメーターは、ミドルウェアの実装を返すために使用される可能性のある任意のJavaScriptオブジェクトです。
関数によって返されるミドルウェアは、URLパラメーターがキャプチャされたときの動作を決定します。
この例では、router.param(name, callback)
シグネチャは router.param(name, accessId)
に変更されています。router.param()
は、名前とコールバックを受け取る代わりに、名前と数値を受け取るようになります。
var express = require('express')
var app = express()
var router = express.Router()
// customizing the behavior of router.param()
router.param(function (param, option) {
return function (req, res, next, val) {
if (val === option) {
next()
} else {
res.sendStatus(403)
}
}
})
// using the customized router.param()
router.param('id', '1337')
// route to trigger the capture
router.get('/user/:id', function (req, res) {
res.send('OK')
})
app.use(router)
app.listen(3000, function () {
console.log('Ready')
})
この例では、router.param(name, callback)
シグネチャは同じままですが、ミドルウェアコールバックの代わりに、ユーザー ID のデータ型を検証するためのカスタムデータ型チェック関数が定義されています。
router.param(function (param, validator) {
return function (req, res, next, val) {
if (validator(val)) {
next()
} else {
res.sendStatus(403)
}
}
})
router.param('id', function (candidate) {
return !isNaN(parseFloat(candidate)) && isFinite(candidate)
})
router.route(path)
オプションのミドルウェアを使用して HTTP 動詞を処理するために使用できる単一のルートのインスタンスを返します。router.route()
を使用して、ルート名の重複を回避し、それによって入力エラーを回避します。
上記の router.param()
の例に基づいて、次のコードは router.route()
を使用してさまざまな HTTP メソッドハンドラーを指定する方法を示しています。
var router = express.Router()
router.param('user_id', function (req, res, next, id) {
// sample user, would actually fetch from DB, etc...
req.user = {
id: id,
name: 'TJ'
}
next()
})
router.route('/users/:user_id')
.all(function (req, res, next) {
// runs for all HTTP verbs first
// think of it as route specific middleware!
next()
})
.get(function (req, res, next) {
res.json(req.user)
})
.put(function (req, res, next) {
// just an example of maybe updating the user
req.user.name = req.params.name
// save user ... etc
res.json(req.user)
})
.post(function (req, res, next) {
next(new Error('not implemented'))
})
.delete(function (req, res, next) {
next(new Error('not implemented'))
})
このアプローチでは、単一の /users/:user_id
パスを再利用し、さまざまな HTTP メソッドのハンドラーを追加します。
注:router.route()
を使用する場合、ミドルウェアの順序は、メソッドハンドラーがルートに追加されたときではなく、ルートが作成されたときに基づきます。この目的のために、メソッドハンドラーは、追加されたルートに属すると考えることができます。
router.use([path], [function, ...] function)
指定されたミドルウェア関数(または複数関数)を、オプションのマウントパス path
で使用します。path
のデフォルトは「/」です。
このメソッドは app.use() と似ています。簡単な例とユースケースを以下に説明します。詳細については、app.use() を参照してください。
ミドルウェアは配管パイプのようなものです。リクエストは、最初に定義されたミドルウェア関数から始まり、一致するパスごとにミドルウェアスタックを「下って」処理されます。
var express = require('express')
var app = express()
var router = express.Router()
// simple logger for this router's requests
// all requests to this router will first hit this middleware
router.use(function (req, res, next) {
console.log('%s %s %s', req.method, req.url, req.path)
next()
})
// this will only be invoked if the path starts with /bar from the mount point
router.use('/bar', function (req, res, next) {
// ... maybe some additional /bar logging ...
next()
})
// always invoked
router.use(function (req, res, next) {
res.send('Hello World')
})
app.use('/foo', router)
app.listen(3000)
「マウント」パスは削除され、ミドルウェア関数には表示されません。この機能の主な効果は、マウントされたミドルウェア関数が「プレフィックス」パス名に関係なく、コード変更なしで動作できることです。
router.use()
でミドルウェアを定義する順序は非常に重要です。それらは順番に呼び出されるため、順序によってミドルウェアの優先順位が決まります。たとえば、通常、ロガーは最初に使用するミドルウェアであり、すべてのリクエストがログに記録されるようにします。
var logger = require('morgan')
var path = require('path')
router.use(logger())
router.use(express.static(path.join(__dirname, 'public')))
router.use(function (req, res) {
res.send('Hello')
})
次に、静的ファイルのログ記録リクエストを無視するが、logger()
の後に定義されたルートとミドルウェアのログ記録を続行するとします。express.static()
の呼び出しを先頭に移動して、ロガーミドルウェアを追加する前に移動するだけです。
router.use(express.static(path.join(__dirname, 'public')))
router.use(logger())
router.use(function (req, res) {
res.send('Hello')
})
もう 1 つの例は、複数のディレクトリからファイルを提供し、「./public」を他のディレクトリよりも優先することです。
router.use(express.static(path.join(__dirname, 'public')))
router.use(express.static(path.join(__dirname, 'files')))
router.use(express.static(path.join(__dirname, 'uploads')))
router.use()
メソッドは、名前付きパラメーターもサポートしているため、他のルーターのマウントポイントで、名前付きパラメーターを使用したプリロードのメリットを得ることができます。
注:これらのミドルウェア関数は特定のルーターを介して追加されますが、それらがいつ実行されるかは、(ルーターではなく)アタッチされているパスによって定義されます。したがって、あるルーターを介して追加されたミドルウェアは、そのルートが一致する場合、他のルーターでも実行される可能性があります。たとえば、このコードは、同じパスにマウントされた 2 つの異なるルーターを示しています。
var authRouter = express.Router()
var openRouter = express.Router()
authRouter.use(require('./authenticate').basic(usersdb))
authRouter.get('/:user_id/edit', function (req, res, next) {
// ... Edit user UI ...
})
openRouter.get('/', function (req, res, next) {
// ... List users ...
})
openRouter.get('/:user_id', function (req, res, next) {
// ... View user ...
})
app.use('/users', authRouter)
app.use('/users', openRouter)
認証ミドルウェアは authRouter
を介して追加されましたが、両方のルーターが /users
にマウントされているため、openRouter
によって定義されたルートでも実行されます。この動作を回避するには、ルーターごとに異なるパスを使用してください。