[英]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 PUT
或Cannot 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 并假设user
是locals
的成员,那就是:
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")然后试试这个:
确保您的表单具有以下属性:
action="/movies/<%= movies._id %>?_method=PUT" method="POST" >
这两个解决方案对我有用。 如果您正在关注 REST,那么使用方法-ovveride else app.post() 也可以解决问题
将res.redirect('path')
改为res.redirect(303, 'path')
在Put
和Delete
,如果要重定向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.