Black Lives Matter(黒人の命は大切だ)。
Equal Justice Initiative(平等な司法イニシアチブ)を支援する.

method-override

NPM Version NPM Downloads Build Status Test Coverage

クライアントが対応していない場合でも、PUT や DELETE などの HTTP 動詞を使用できます。

インストール

これは、Node.js モジュールであり、npm レジストリ から入手できます。インストールは、npm install コマンドを使用して行います。

$ npm install method-override

API

注意 このモジュールは、リクエストのメソッドを知る必要があるモジュール(たとえば、csurf モジュール)のに使用する必要があります。

methodOverride(getter, options)

req.method プロパティを新しい値でオーバーライドする新しいミドルウェア関数を作成します。この値は、指定された getter から取得されます。

  • getter - リクエストのオーバーライドされたリクエストメソッドを検索するために使用するゲッター。(デフォルト: X-HTTP-Method-Override
  • options.methods - メソッドオーバーライド値をチェックするために、元の要求が属している必要がある許可されたメソッド。(デフォルト: ['POST']

見つかったメソッドが node.js コアでサポートされている場合、req.method は、元々その値であったかのように、この値に設定されます。以前の req.method 値は req.originalMethod に格納されます。

getter

これは、リクエストからオーバーライド値を取得する方法です。関数が提供されている場合、req は最初の引数として、res は 2 番目の引数として渡され、メソッドが返されることが期待されます。文字列が指定されている場合、文字列は次のルールでメソッドを検索するために使用されます。

  • 文字列が X- で始まる場合、ヘッダーの名前として扱われ、そのヘッダーがメソッドのオーバーライドに使用されます。リクエストに同じヘッダーが複数回含まれている場合、最初の出現が使用されます。
  • 他のすべての文字列は、URL クエリ文字列のキーとして扱われます。

options.methods

これは、メソッドオーバーライド値をチェックするために、リクエストが必ず属している必要があるメソッドを指定できます。これはデフォルトでは 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>

ライセンス

MIT