由于我在客户端中出现错误,我的node / express API在每次发送表单时都会同时获得两次完全相同的PUT请求。
作为响应,服务器总是崩溃并出现以下错误:
Error: Can't set headers after they are sent
现在我修复了客户端,因此服务器不再崩溃,但我想正确修复API。任何人都可以通过同时发送两个PUT请求来杀死我的服务器。
所以我的问题:
这是我的服务器代码:
server.js
router.route('/deals/:id').put(deal.update);
deal.js
var r = {};
exports.update = function(req, res) {
r = res;
var u = {
$set: {}
}
for(var x in req.body){
if (['name','stages'].indexOf(x)>=0)
u.$set[x] = req.body[x];
}
Pipeline // this is a mongoose object
.findOneAndUpdate({'_id.id':req.params.id},u,{new:true})
.exec(respond);
}
function respond(err, data) {
if (err) {
return r.send(err);
} else {
return r.json(data);
}
}
更新
错误来自于我如何声明全局r,以便在我的所有方法之外进行单个响应回调。
我通过对每个方法进行一次响应回调来修复它。
仍然有兴趣知道我是否可以使用绑定(res)来逃避?
答案 0 :(得分:0)
您错过了返回,因此当出现错误时,您拨打了res.send
两次。通过返回,执行将在第一个之后停止。
我知道您要为后续问题做些什么,但制作全局变量r
绝对是不的好方法。我这样做模式的方法是将res
传递给后续函数 - 见下文。可能有更好的方法,但这至少看似合法。
exports.update = function(req, res) {
var u = {
$set: {}
}
for(var x in req.body){
if (['name','stages'].indexOf(x)>=0)
u.$set[x] = req.body[x];
}
Pipeline // this is a mongoose object
.findOneAndUpdate({'_id.id':req.params.id},u,{new:true})
.exec(function(err, data) { respond(err, data, res) });
}
function respond(err, data, res) {
if (err) {
return res.send(err);
}
return res.json(data);
}