Node.js - Express 4.x - 方法覆盖不处理PUT请求

flu*_*ore 17 javascript connect node.js express

我试图让服务器处理PUT请求.但无济于事.提交表单后,客户端始终收到"无法发送/"消息. 我正在使用Express 4.x.

请注意,如果我在路线中将"put"更改为"post",请求处理得很好......

如何让我的服务器处理'PUT'请求?

服务器:

var express         = require("express");
var bodyParser      = require("body-parser");
var methodOverride  = require("method-override");

var app             = express();

app.use(bodyParser());
app.use(methodOverride());


app.get("/",function(req,res){
    res.render("index.ejs");
    console.log("GET received.");
});
app.put("/",function(req,res){
    console.log("PUT received: " + req.body.userName + " - " + req.body.password);
});

app.listen(1337);
console.log("Listening on 1337.");
Run Code Online (Sandbox Code Playgroud)

客户

<!DOCTYPE html>
<html>
    <head>
        <title>TODO supply a title</title>
    </head>
    <body>
        <form action="/" method="post">
            First
            <input type="text" name="first">
            Last
            <input type="text" name="last">
            <input type="hidden" name="_method" value="put">
            <button type="submit">Submit</button>
        </form>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

max*_*nes 18

可以使用查询值覆盖更简单的方法:

var methodOverride = require('method-override')

// override with POST having ?_method=PUT
app.use(methodOverride('_method'))
Run Code Online (Sandbox Code Playgroud)

使用HTML进行查询覆盖的示例调用:

<form method="POST" action="/resource?_method=PUT">
  <button type="submit">Put resource</button>
</form>
Run Code Online (Sandbox Code Playgroud)

  • 干杯.这解决了问题的最小数量,所以应该被认为是最好的答案. (3认同)

Tim*_*per 12

方法覆盖v2.0.0(发布2014-06-01)开始,中间件的默认行为不会检查POST正文中的_method字段; 它只检查X-HTTP-Method-Override标题.

为了使方法覆盖像以前的版本一样操作,您需要提供自定义函数methodOverride,在项目页面上详细说明:

自定义逻辑

您可以使用函数实现任何类型的自定义逻辑getter.下面实现了寻找的逻辑req.body,这是在method-override1:

var bodyParser     = require('body-parser')

var connect        = require('connect')
var methodOverride = require('method-override')

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
  }
}))
Run Code Online (Sandbox Code Playgroud)

  • 这是不必要的.下面的答案是正确的,因为您可以在`method-override`文档中阅读[here](https://github.com/expressjs/method-override#override-using-a-query-value).下面的答案已经显示出来了.它应该是正确的. (7认同)