18

好的,所以我在这里设置了一个简单的 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);
        });
})

当我提出请求时,我只会收到“Cannot PUT”或“Cannot DELETE”错误。

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

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

我研究了 expressjs 对方法删除和放置方法的支持的问题,而没有方法覆盖

大多数 Web 浏览器中是否提供 PUT、DELETE、HEAD 等方法?

和其他几个人一起。我还多次引用了 express.js 和 mongo 文档。我只是想不出可能出了什么问题。

任何帮助表示赞赏。

4

7 回答 7

13

更新

正如 Jonathan Lonowski 指出的PUT也可以使用,所以你可以忽略我的旧答案。获取Cannot PUTCannot POST错误,意味着您的回调未成功执行。我的猜测是Users.update失败了,这就是它不能 POST 或 PUT 的原因。你能检查一下吗。

旧答案

尝试更改此行

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

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

因为您正在尝试提交表单

于 2013-03-04T04:05:51.853 回答
3

您是否在视图或文件<form>中列出?static__dirname + "/public"

在静态文件中,'s#{user.name}可能不会被替换,并且将被视为URL Fragmentusername

<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 并假设user是 的成员locals,那将是:

form(method='POST', action='/users/' + user.name)
  input(type='hidden', name='_method', value='PUT')
于 2013-03-04T04:06:22.820 回答
1

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

于 2013-03-04T04:27:12.023 回答
1

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

于 2018-09-22T21:13:58.407 回答
0

app.post("/movies/:id")是一种解决方案。如果您仍想使用app.put("/movies/:id") ,请尝试以下操作:

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

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

这两个解决方案对我有用。如果您遵循 REST,则使用方法 ovveride else app.post() 也可以解决问题

于 2019-07-21T16:08:40.223 回答
0

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

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

于 2019-08-20T16:07:24.183 回答
0

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

首先通过 npm安装cors包:

npm i cors

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

const cors = require('cors')

app.use(cors())
于 2019-12-31T08:01:01.963 回答