讓您在客戶端不支援的地方使用 HTTP 動詞,例如 PUT 或 DELETE。
這是透過 npm 註冊 所提供的 Node.js 模組。安裝時使用 npm install
指令
$ npm install method-override
注意 在任何需要知道請求方法的模組之前使用這個模組非常重要(例如,它必須在 csurf
模組之前使用)。
建立一個新的中間件函式,以新的值覆寫 req.method
屬性。這個值會從提供的 getter
中提取。
getter
- 使用的 getter,用於查詢請求的覆寫請求方法。(預設:X-HTTP-Method-Override
)options.methods
- 原始請求必須包含的允許方法,才能檢查方法覆寫值。(預設:['POST']
)如果找到的方法受 node.js 核心支援,則 req.method
會設定為這個值,就像它原本就是這個值一樣。先前的 req.method
值會儲存在 req.originalMethod
中。
這是從請求中取得覆寫值的函式。如果提供函式,則 req
會傳遞為第一個引數,res
會傳遞為第二個引數,並預期傳回方法。如果提供字串,則會使用字串來查詢方法,規則如下
X-
開頭,則會將其視為標頭名稱,並使用該標頭進行方法覆寫。如果請求包含同一個標頭多次,則會使用第一次出現的標頭。這允許指定要求必須採用的方法,才能檢查方法覆寫值。這預設為僅限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@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>