在发送标头后,我一直无法设置标头,我认为问题是因为我要两次调用res.status(400).json,但是我不知道该怎么做,因为我是新的节点和猫鼬。
createItem: function (req, res) {
var item = new Items();
item.name = req.body.name;
item.save(err => {
if (err) {return res.status(400).json({'error': err});}
for(let i of req.body.subItems){
var sub = new SubItems();
sub.name = i.name;
sub.item = item._id;
sub.save(err => {
if (err) {return res.status(400).json({'error': err});}
})
item.subItems.push(sub);
item.save(err => {
if (err) {return res.status(400).json({'error': err});}
});
}
return res.status(200).send(item);
});
}
};
答案 0 :(得分:-2)
是的,这是因为您要返回res.status(400).json({'error': err});
而不是仅仅在那里完成该功能。通过调用res.status().json()
或调用res.send()
或类似方法将结束该函数并将响应发送给调用者。
通过在回调中返回它,它将返回到仍在运行并进入res.status(200).send(item);
的调用程序函数,但是由于您已经将其设置为res.status(400).json({'error': err});
,因此标头已经被设置因此会引发错误。
要解决此问题,如前所述,您可以只写res.status(400).json({'error': err});
而不能返回,因为这将完成请求。另外,您可以使用next
回调函数,并在末尾使用通用错误处理程序来处理错误。请注意,如果要执行此方法,则必须将next
作为参数添加到createItem function
中。
删除退货的代码
createItem: function (req, res) {
var item = new Items();
item.name = req.body.name;
item.save(err => {
if (err) {res.status(400).json({'error': err});}
for(let i of req.body.subItems){
var sub = new SubItems();
sub.name = i.name;
sub.item = item._id;
sub.save(err => {
if (err) {res.status(400).json({'error': err});}
})
item.subItems.push(sub);
item.save(err => {
if (err) {res.status(400).json({'error': err});}
});
}
return res.status(200).send(item);
});
}
};