黑人生命也是命。
支持平等正义倡议.

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 - 用于查找请求的覆盖请求方法的 getter。(默认值:X-HTTP-Method-Override
  • options.methods - 原始请求必须位于其中才能检查方法覆盖值的允许方法。(默认值:['POST']

如果 found 方法受 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@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