繁体   English   中英

Express 不能 PUT/DELETE 方法。 出了什么问题?

[英]Express cannot PUT/DELETE method. What is going wrong?

好的所以我在这里设置了一个简单的 node.js / express.js / mongodb 应用程序,我的配置如下。

var express = require('express'),
    mongoose = require('mongoose');
    http = require('http');

var app = express();

    app.configure(function(){
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');

    //middleware stack
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(app.router);
    app.use(express.static(__dirname + "/public"));
});

mongoose.connect("mongodb://localhost/hello");

问题在于当我尝试发出 PUT 或 DELETE 请求时。 我的表格就是这么简单

<form method="POST" action="/users/#{user.name}">
    <input type="hidden" name="_method" value="PUT"/>
</form>

现在我的路由器使用 express .put() 方法捕获路由

app.put('/users/:name', function(req, res) {

    var b = req.body;

    Users.update(
        { name: req.user.name },
        { name: b.name, age: b.age, email: b.email },
        function(err) {
            res.redirect('/users/'+b.name);
        });
})

当我提出请求时,我只会收到“无法放置”或“无法删除”错误。

我试图通过 chomes RESTful 客户端发出相同的请求,结果相同。

我读过一个话题,女巫和我有同样的问题,尽管按照评论回答并没有解决我的问题。

我研究了expressjs 对方法删除和放置的支持而不使用 methodoverride 的问题

大多数 Web 浏览器都提供 PUT、DELETE、HEAD 等方法吗?

与其他一些人一起。 我还多次引用了 express.js 和 mongo 文档。 我只是想不出哪里出了问题。

任何帮助表示赞赏。

更新

正如乔纳森·洛诺夫斯基(Jonathan Lonowski)指出的那样,也可以使用PUT ,因此您可以忽略我的旧答案。 出现Cannot PUTCannot POST错误,意味着您的回调没有成功执行。 我的猜测是Users.update失败,这就是它不能 POST 或 PUT 的原因。 你能检查一下吗。

旧答案

尝试更改此行

app.put('/users/:name', function(req, res) {

app.post('/users/:name', function(req, res) {

因为您正在尝试提交表单

您在__dirname + "/public"下的视图或static文件中列出了<form>吗?

在静态文件中, #{user.name}可能不会被user name替换,而是会被视为URL Fragment

<form>实际上将提交到/users/而不是/users/:name因为这是path

console.log(url.parse('/users/#{user.name}'));

{ hash: '#{user.name}',
  pathname: '/users/',
  path: '/users/',
  href: '/users/#{user.name}' }

如果不是,则<form>应该从视图生成,因为action需要是动态的和数据驱动的。 使用 Jade 并假设userlocals的成员,那就是:

form(method='POST', action='/users/' + user.name)
  input(type='hidden', name='_method', value='PUT')

除非有奇怪的魔法在起作用,否则您的表单会发出 POST 请求,而不是 PUT。 如果你想 PUT,我建议使用带有type: 'PUT'参数的jQuery.ajax函数,就像这个答案一样,来自表单处理程序,请参阅jQuery.submit 不要忘记return false以便表单不会提交两次。

如果您的 using 方法覆盖,请确保在使用路由之前已声明它。 这就是我遇到的问题。

app.post("/movies/:id")是一种解决方案。 如果你仍然想使用app.put("/movies/:id")然后试试这个:

  1. 从 npm 安装 method-override。
  2. 在你的 app.js 文件中需要它。
  3. 打开您想要调用 PUT 请求的表单
  4. 确保您的表单具有以下属性:

    action="/movies/<%= movies._id %>?_method=PUT" method="POST" >

这两个解决方案对我有用。 如果您正在关注 REST,那么使用方法-ovveride else app.post() 也可以解决问题

res.redirect('path')改为res.redirect(303, 'path')

PutDelete ,如果要重定向get地址,则应将 303 作为第一个参数传递。 来源

一种解决方案是在您的app.js文件中为您的PUT、PATCH 和 DELETE请求使用cors中间件,如下所示:

首先通过 npm 安装cors包:

npm i cors

然后将以下代码添加到您的 app.js 中:

const cors = require('cors')

app.use(cors())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM