首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Node.js - Express 4.x -方法-覆盖不处理PUT请求

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

Stack Overflow用户
提问于 2014-06-03 23:47:58
回答 5查看 15.3K关注 0票数 18

我正在尝试让服务器处理PUT请求。但无济于事。提交表单后,客户端一直收到"Cannot POST /“消息。我使用的是4.x。

请注意,如果我在路由中将"put“更改为"post”,请求就会得到很好的处理……

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

服务器:

代码语言:javascript
复制
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.");

客户端

代码语言:javascript
复制
<!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>
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-06-27 11:06:38

一种更简单的方法是override using a query value

代码语言:javascript
复制
var methodOverride = require('method-override')

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

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

代码语言:javascript
复制
<form method="POST" action="/resource?_method=PUT">
  <button type="submit">Put resource</button>
</form>
票数 20
EN

Stack Overflow用户

发布于 2014-06-04 00:14:32

method-override v2.0.0 (release 2014-06-01)开始,中间件的默认行为不检查_method字段的POST正文;它只检查X-HTTP-Method-Override头。

为了让方法覆盖像以前的版本一样运行,您需要向methodOverride提供一个自定义函数,这在the project page中有详细介绍

自定义逻辑

您可以使用getter的函数实现任何类型的自定义逻辑。以下代码实现了在method-override 1中查找req.body的逻辑:

var bodyParser =require(‘主体解析器’) var connect = require('connect') var methodOverride =require(‘方法覆盖’) app.use(bodyParser.urlencoded()) app.use(methodOverride(function(req,res){ if (req.body && typeof req.body === 'object‘&& '_method’in req.body) { //查找var编码的POST正文并将其删除var method = req.body._method delete req.body._method return method }})

票数 13
EN

Stack Overflow用户

发布于 2017-01-27 02:19:39

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

代码语言:javascript
复制
     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();
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24019489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档