黑人生命也是命。
支持平等正義倡議.

method-override

NPM Version NPM Downloads Build Status Test Coverage

讓您在客戶端不支援的地方使用 HTTP 動詞,例如 PUT 或 DELETE。

安裝

這是透過 npm 註冊 所提供的 Node.js 模組。安裝時使用 npm install 指令

$ npm install method-override

API

注意 在任何需要知道請求方法的模組之前使用這個模組非常重要(例如,它必須csurf 模組之前使用)。

methodOverride(getter, options)

建立一個新的中間件函式,以新的值覆寫 req.method 屬性。這個值會從提供的 getter 中提取。

  • getter - 使用的 getter,用於查詢請求的覆寫請求方法。(預設:X-HTTP-Method-Override
  • options.methods - 原始請求必須包含的允許方法,才能檢查方法覆寫值。(預設:['POST']

如果找到的方法受 node.js 核心支援,則 req.method 會設定為這個值,就像它原本就是這個值一樣。先前的 req.method 值會儲存在 req.originalMethod 中。

getter

這是從請求中取得覆寫值的函式。如果提供函式,則 req 會傳遞為第一個引數,res 會傳遞為第二個引數,並預期傳回方法。如果提供字串,則會使用字串來查詢方法,規則如下

  • 如果字串以 X- 開頭,則會將其視為標頭名稱,並使用該標頭進行方法覆寫。如果請求包含同一個標頭多次,則會使用第一次出現的標頭。
  • 所有其他字串都視為 URL 查詢字串中的金鑰。

options.methods

這允許指定要求必須採用的方法,才能檢查方法覆寫值。這預設為僅限POST方法,這是覆寫應採用的唯一方法。可以在此處指定更多方法,但可能會引發安全性問題,並在要求透過快取傳送時造成奇怪的行為。這個值是採用大寫字母表示的方法陣列。可以指定null以允許所有方法。

範例

使用標頭覆寫

若要使用標頭覆寫方法,請將標頭名稱指定為methodOverride函式的字串引數。然後,若要進行呼叫,請將POST要求傳送至 URL,其中覆寫的方法為該標頭的值。這種使用標頭的方法通常會與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函式的字串引數。然後,若要進行呼叫,請將POST要求傳送至 URL,其中覆寫的方法為該查詢字串金鑰的值。這種使用查詢值的方法通常會與純 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@1req.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