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

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

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

当我提出请求时,我只是得到一个“无法”或“无法删除”的错误。

我试图通过与RESTful客户端相同的结果做出相同的请求。

我已经阅读了一个主题女巫与我有同样的问题,虽然遵循评论的答案并没有解决我的问题。

问题我已经考虑到expressjs方法删除的支持,并放在没有方法覆盖

PUT,DELETE,HEAD等方法在大多数Web浏览器中都可用?

与其他一些人一起。 我也多次引用了express.js和mongo文档。 我只是不能认为会出现什么问题。

任何帮助表示赞赏。

更新

Jonathan Lonowski指出PUT也可以使用,所以你可以忽略我的旧答案。 获取Cannot PUTCannot POST错误,意味着你的callback没有成功执行。 我的猜测是Users.update失败,这就是为什么它不能POST或PUT。 你能检查一下吗?

老答案

尝试改变这一行

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

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

因为您正在尝试提交表单

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

在一个静态文件中, #{user.name}可能不会被username所替代,并且会被当做一个URL片段 。

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

 console.log(url.parse('/users/#{user.name}')); { hash: '#{user.name}', pathname: '/users/', path: '/users/', href: '/users/#{user.name}' } 

如果不是由action需要dynamic和数据驱动,那么应该从视图中生成<form> 。 用Jade和假设userlocals的成员,那将是:

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

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