クライアントが対応していない場合でも、PUT や DELETE などの HTTP 動詞を使用できます。
これは、Node.js モジュールであり、npm レジストリ から入手できます。インストールは、npm install
コマンドを使用して行います。
$ npm install method-override
注意 このモジュールは、リクエストのメソッドを知る必要があるモジュール(たとえば、csurf
モジュール)の前に使用する必要があります。
req.method
プロパティを新しい値でオーバーライドする新しいミドルウェア関数を作成します。この値は、指定された getter
から取得されます。
getter
- リクエストのオーバーライドされたリクエストメソッドを検索するために使用するゲッター。(デフォルト: X-HTTP-Method-Override
)options.methods
- メソッドオーバーライド値をチェックするために、元の要求が属している必要がある許可されたメソッド。(デフォルト: ['POST']
)見つかったメソッドが node.js コアでサポートされている場合、req.method
は、元々その値であったかのように、この値に設定されます。以前の req.method
値は req.originalMethod
に格納されます。
これは、リクエストからオーバーライド値を取得する方法です。関数が提供されている場合、req
は最初の引数として、res
は 2 番目の引数として渡され、メソッドが返されることが期待されます。文字列が指定されている場合、文字列は次のルールでメソッドを検索するために使用されます。
X-
で始まる場合、ヘッダーの名前として扱われ、そのヘッダーがメソッドのオーバーライドに使用されます。リクエストに同じヘッダーが複数回含まれている場合、最初の出現が使用されます。これは、メソッドオーバーライド値をチェックするために、リクエストが必ず属している必要があるメソッドを指定できます。これはデフォルトでは POST
メソッドのみに設定されており、これはオーバーライドが到着する唯一のメソッドです。ここでより多くのメソッドを指定できますが、セキュリティ上の問題が発生したり、リクエストがキャッシュを通過するときに奇妙な動作が発生する可能性があります。この値は大文字のメソッドの配列です。null
を指定すると、すべてのメソッドを許可できます。
ヘッダーを使用してメソッドをオーバーライドするには、ヘッダー名を文字列引数として methodOverride
関数に指定します。次に、呼び出しを行うには、オーバーライドされたメソッドをそのヘッダーの値として持つ URL に POST
リクエストを送信します。ヘッダーを使用するこの方法は、通常、使用しようとしているメソッドをサポートしていない実装で XMLHttpRequest
と組み合わせて使用されます。
var express = require('express')
var methodOverride = require('method-override')
var app = express()
// override with the X-HTTP-Method-Override header in the request
app.use(methodOverride('X-HTTP-Method-Override'))
XMLHttpRequest
を使用したヘッダーオーバーライドによる呼び出し例
var xhr = new XMLHttpRequest()
xhr.onload = onload
xhr.open('post', '/resource', true)
xhr.setRequestHeader('X-HTTP-Method-Override', 'DELETE')
xhr.send()
function onload () {
alert('got response: ' + this.responseText)
}
クエリ文字列値を使用してメソッドをオーバーライドするには、クエリ文字列キーを文字列引数として methodOverride
関数に指定します。次に、呼び出しを行うには、オーバーライドされたメソッドをそのクエリ文字列キーの値として持つ URL に POST
リクエストを送信します。クエリ値を使用するこの方法は、通常、レガシーブラウザをサポートしながらも新しいメソッドを使用しようとする場合に、プレーン HTML <form>
要素と組み合わせて使用されます。
var express = require('express')
var methodOverride = require('method-override')
var app = express()
// override with POST having ?_method=DELETE
app.use(methodOverride('_method'))
HTML <form>
を使用したクエリオーバーライドによる呼び出し例
<form method="POST" action="/resource?_method=DELETE">
<button type="submit">Delete resource</button>
</form>
var express = require('express')
var methodOverride = require('method-override')
var app = express()
// override with different headers; last one takes precedence
app.use(methodOverride('X-HTTP-Method')) // Microsoft
app.use(methodOverride('X-HTTP-Method-Override')) // Google/GData
app.use(methodOverride('X-Method-Override')) // IBM
getter
に関数を使用することで、あらゆる種類のカスタムロジックを実装できます。以下は、method-override@1
にあった req.body
を検索するロジックを実装しています。
var bodyParser = require('body-parser')
var express = require('express')
var methodOverride = require('method-override')
var app = express()
// NOTE: when using req.body, you must fully parse the request body
// before you call methodOverride() in your middleware stack,
// otherwise req.body will not be populated.
app.use(bodyParser.urlencoded())
app.use(methodOverride(function (req, res) {
if (req.body && typeof req.body === 'object' && '_method' in req.body) {
// look in urlencoded POST bodies and delete it
var method = req.body._method
delete req.body._method
return method
}
}))
HTML <form>
を使用したクエリオーバーライドによる呼び出し例
<!-- enctype must be set to the type you will parse before methodOverride() -->
<form method="POST" action="/resource" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="_method" value="DELETE">
<button type="submit">Delete resource</button>
</form>