允许你在客户端不支持的情况下使用诸如 PUT 或 DELETE 等 HTTP 动词。
这是一个 Node.js 模块,可通过 npm 注册表 获得。安装使用 npm install
命令 完成
$ npm install method-override
注意非常重要的是,此模块必须在任何需要知道请求方法的模块之前使用(例如,它必须在 csurf
模块之前使用)。
创建一个新的中间件函数,以新值覆盖 req.method
属性。此值将从提供的 getter
中提取。
getter
- 用于查找请求的覆盖请求方法的 getter。(默认值:X-HTTP-Method-Override
)options.methods
- 原始请求必须位于其中才能检查方法覆盖值的允许方法。(默认值:['POST']
)如果 found 方法受 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>