PUT和DELETE总是通过Node + Express路由到GET
问题描述:
我是Node/Express的初学者。我试图做一个CRUD应用程序,但坚持更新和删除。我认为我的路由器代码有问题,但我不知道为什么。以下代码位于我的控制器中,一切正常,但PUT
和DELETE
。它总是路由到GET
。我试图使用next();
,但它返回此错误:Can't set headers after they are sent.
。PUT和DELETE总是通过Node + Express路由到GET
我可以使用GET /:company_id/delete
进行删除工作,但这不是一个好的标准化解决方案。我如何获得更新和删除过程?
'use strict';
var Companies = require('../../models/companies');
module.exports = function (router) {
// INDEX
// accessed at GET http://localhost:8000/companies
router.get('/', function (req, res) {
Companies.find(function(err, model) {
if (err) {
res.send(err);
}
else {
res.format({
json: function() {
res.json(model);
},
html: function() {
res.render('companies/index', model);
}
});
}
});
});
// CREATE VIEW
// accessed at GET http://localhost:8000/companies/create
router.get('/create', function (req, res) {
res.render('companies/create');
});
// CREATE DATA
// accessed at POST http://localhost:8000/companies
router.post('/', function (req, res) {
var name = req.body.name && req.body.name.trim();
var type = req.body.type && req.body.type.trim();
// VALIDATION
if (name === '') {
res.redirect('/companies/create');
return;
}
var model = new Companies({name: name, type: type});
model.save(function(err) {
if (err) {
res.send(err);
}
else {
res.redirect('/companies');
}
});
});
// READ
// accessed at GET http://localhost:8000/companies/:company_id
router.get('/:company_id', function(req, res) {
Companies.findById(req.params.company_id, function(err, model) {
if (err) {
res.send(err);
}
else {
res.render('companies/read', model);
}
});
});
// UPDATE VIEW
// accessed at GET http://localhost:8000/companies/:company_id/edit
router.get('/:company_id/edit', function(req, res) {
Companies.findById(req.params.company_id, function(err, model) {
if (err) {
res.send(err);
}
else {
res.render('companies/edit', model);
}
});
});
// UPDATE DATA
// accessed at PUT http://localhost:8000/companies/:company_id
router.put('/:company_id', function(req, res) {
Companies.findById(req.params.company_id, function(err, model) {
if (err) {
res.send(err);
}
else {
model.name = req.body.name;
model.type = req.body.type;
model.save(function(err) {
if (err) {
res.send(err);
}
else {
res.redirect('/companies');
}
});
}
});
});
// DELETE
// accessed at DELETE http://localhost:8000/companies/:company_id
router.delete('/:company_id', function (req, res) {
Companies.remove({ _id: req.params.company_id }, function(err) {
if (err) {
res.send(err);
}
else {
res.redirect('/companies');
}
});
});
};
答
HTML表单仅支持GET
和POST
。然而,XMLHTTPRequest支持PUT
和DELETE
,因此您可能必须使用此路线或使用类似method-override的内容来允许使用其他HTTP动词提交HTML表单。
+0
我正在关注krakenjs示例,并尝试在隐藏输入中添加'_method'。我忘了检查'package.json'是否有额外的库。谢谢您的回答。 :) – shankshera 2014-10-11 22:29:55
你可以发布你要发送的请求的标题吗? – n0mercy 2014-10-11 22:02:53
这是来自'DELETE'的请求。我把'DELETE'方法放在它的表单中,但仍然路由到'GET'。 '127.0.0.1 - - [Sat,11 Oct 2014 22:07:58 GMT]“GET/companies/5439a1316ed75300007010b7?_csrf = xWMPPDBp9W%2B1meXWKqM3QSgWGRCXs4HeUuMZE%3D HTTP/1.1”200 7044“http:// localhost:8000 /公司“”Mozilla/5.0(Macintosh;英特尔Mac OS X 10_9_4)AppleWebKit/537.36(KHTML,如Gecko)Chrome/37.0.2062.124 Safari/537.36“' – shankshera 2014-10-11 22:10:26
问题出在您的客户端请求中。你的javascript看起来如何? – n0mercy 2014-10-11 22:13:49