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

我正在尝试让服务器处理一个PUT请求。 但无济于事。 提交表单后,客户端不断收到“无法POST /”消息。 我正在使用Express 4.x.

请注意,如果我更改“放”到我的路线“后”,请求得到处理就好了…

我如何让我的服务器处理'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."); 

客户

 <!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> 

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

 var methodOverride = require('method-override') // override with POST having ?_method=PUT app.use(methodOverride('_method')) 

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

 <form method="POST" action="/resource?_method=PUT"> <button type="submit">Put resource</button> </form> 

从方法重写v2.0.0 (2014-06-01发布)开始,中间件的默认行为不检查_method字段的POST主体; 它只检查X-HTTP-Method-Override头。

为了使方法重写像以前的版本一样运行,您需要为methodOverride提供一个自定义函数, 在项目页面上详细介绍:

定制逻辑

你可以用getter的函数来实现任何types的自定义逻辑。 以下实现查找req.body中的method-override 1中的逻辑:

 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 } })) 

你可以select如何覆盖:

 // 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 

我们也可以使用一个简单的中间件来处理x-http-method-override

  var router = express.Router(); /** * Middleware that detects a HTTP method tunneled, * inside the header of another HTTP method. Detects * and routs to the method mentioned in the header. */ router.use((req,resp,next)=>{ if(req.headers['x-http-method-override']){ req.method = req.headers['x-http-method-override']; } next(); });