我在使用一个简单的todo MEAN应用程序时遇到了一个奇怪的问题,我正在使用远程数据库,每当我更新或删除一条记录时(并非总是如此),它都会抛出错误:
events.js:160
throw er; // Unhandled 'error' event
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11)
at ServerResponse.header (E:\Examples\mean-stack-todo\node_modules\express\lib\response.js:730:10)
at ServerResponse.json (E:\Examples\mean-stack-todo\node_modules\express\lib\response.js:253:10)
at E:\Examples\mean-stack-todo\app\routes.js:11:13
at E:\Examples\mean-stack-todo\node_modules\mongoose\lib\model.js:3800:16
at E:\Examples\mean-stack-todo\node_modules\kareem\index.js:220:48
at E:\Examples\mean-stack-todo\node_modules\kareem\index.js:131:16
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)
POST和DELETE会出现此错误,其中的实现是:
app.post('/api/todos', function (req, res) {
// create a todo, information comes from AJAX request from Angular
Todo.create({
text: req.body.text,
done: false
}, function (err, todo) {
if (err) {
res.send(err);
}
// get and return all the todos after you create another
getTodos(res);
});
});
并删除:
// delete a todo
app.delete('/api/todos/:todo_id', function (req, res) {
Todo.remove({
_id: req.params.todo_id
}, function (err, todo) {
if (err) {
res.send(err);
}
getTodos(res);
});
});
我不知道错误的起源在哪里。
答案 0 :(得分:1)
错误:发送后无法设置标头
这意味着您已经两次或更多次回复,这是不可能的。
出错时,你必须使用return,否则将调用getTodos函数,我猜你会回复两次,第一次出错,第二次出现在getTodos函数中。
// delete a todo
app.delete('/api/todos/:todo_id', function (req, res) {
Todo.remove({
_id: req.params.todo_id
}, function (err, todo) {
if (err) {
// added the return
return res.send(err);
}
getTodos(res);
});
});