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 PUT
或Cannot 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}
可能不会被user
的name
所替代,并且会被当做一个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和假设user
是locals
的成员,那将是:
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
以免表单提交两次。
- 代理json请求与节点expression
- Node.js – 设置默认局部variables传递到布局/模板
- Nodejs http://test.dev:3000/api/profile。 没有'Access-Control-Allow-Origin'标题Origin'http:// localhost:9000'
- Node.js + express – 在客户端检索服务器端数据
- Passport.js:authentication后如何访问用户对象?
- 如何将中间件的更改传递给socket.io?
- 无法访问表示从控制台,Windows 7的expression闲谈
- Express.js 4个路由与router.route不匹配
- NodeJS服务器声明