Javascript 无法在Node.js中发送标题后设置标题
我试图理解下面的代码是如何工作的,而后面的代码则不是Javascript 无法在Node.js中发送标题后设置标题,javascript,angularjs,node.js,Javascript,Angularjs,Node.js,我试图理解下面的代码是如何工作的,而后面的代码则不是 var Todo = require('./models/database'); function getTodos(res){ Todo.find() .sort('-created_at') .exec(function(err, todos) { if (err) return console.error(err); // ISSUE HERE
var Todo = require('./models/database');
function getTodos(res){
Todo.find()
.sort('-created_at')
.exec(function(err, todos) {
if (err) return console.error(err);
// ISSUE HERE
res.json(todos, function(err){
if (err) console.log(err);
}); // return all todos in JSON format
});
};
module.exports = function(app) {
// api ---------------------------------------------------------------------
// get all todos
app.get('/api/todos', function(req, res) {
getTodos(res);
});
// update a todo
app.get('/api/todos/:todo_id/:replacedText', function(req, res) {
console.dir(req.params.todo_id);
console.dir(req.params.replacedText);
Todo.update({ _id : req.params.todo_id},
{$set: {text: req.params.replacedText}},
function(err, todo) {
if (err) res.send(err);
getTodos(res);
});
});
// application -------------------------------------------------------------
app.get('*', function(req, res) {
res.sendfile('./public/index.html'); // load the single view file (angular will handle the page changes on the front-end)
});
};
上述代码有效。但是当我在Todo.find()下的代码是:
这不管用。我得到以下错误:
http http.js:689
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:689:11)
at ServerResponse.header (\node_modules\express\lib\response.js:595:10)
at ServerResponse.send (\node_modules\express\lib\response.js:143:12)
at ServerResponse.json (\node_modules\express\lib\response.js:229:15)
at Promise.<anonymous> (\app\routes.js:70:12)
at Promise.<anonymous> (\node_modules\mongoose\node_modules\mpromise\lib\promise.js:177:8)
at Promise.emit (events.js:95:17)
at Promise.emit (\node_modules\mongoose\node_modules\mpromise\lib\promise.js:84:38)
at Promise.fulfill (\node_modules\mongoose\node_modules\mpromise\lib\promise.js:97:20)
at Promise.resolve (\node_modules\mongoose\lib\promise.js:114:23)
http.js:689
抛出新错误('发送头后无法设置头');
^
错误:发送邮件后无法设置邮件头。
位于ServerResponse.OutgoingMessage.setHeader(http.js:689:11)
在ServerResponse.header(\node\u modules\express\lib\response.js:595:10)
在ServerResponse.send(\node\u modules\express\lib\response.js:143:12)
位于ServerResponse.json(\node\u modules\express\lib\response.js:229:15)
答应。(\app\routes.js:70:12)
答应。(\node\u modules\mongoose\node\u modules\mpromise\lib\promise.js:177:8)
在Promise.emit(events.js:95:17)
在Promise.emit(\node\u modules\mongoose\node\u modules\mpromise\lib\Promise.js:84:38)
在Promise.fulfill(\node\u modules\mongoose\node\u modules\mpromise\lib\Promise.js:97:20)
在Promise.resolve(\node\u modules\mongoose\lib\Promise.js:114:23)
帮我弄清楚,这里发生了什么。我相信这是一个响应对象函数。我以前见过类似的错误,如果我没记错的话,那是因为我试图多次恢复发送内容。可能您遇到错误,在Todo.find方法之前调用res.send?再次设置标题。您可能只需编写()即可。@JonathanLonowski已经更新了代码。这里是否适用多重响应?@dandavis我浏览了response.js。我仍然不太清楚http请求响应应该如何实现。如果你能指出一些我应该阅读的文档,那就太好了。
http http.js:689
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:689:11)
at ServerResponse.header (\node_modules\express\lib\response.js:595:10)
at ServerResponse.send (\node_modules\express\lib\response.js:143:12)
at ServerResponse.json (\node_modules\express\lib\response.js:229:15)
at Promise.<anonymous> (\app\routes.js:70:12)
at Promise.<anonymous> (\node_modules\mongoose\node_modules\mpromise\lib\promise.js:177:8)
at Promise.emit (events.js:95:17)
at Promise.emit (\node_modules\mongoose\node_modules\mpromise\lib\promise.js:84:38)
at Promise.fulfill (\node_modules\mongoose\node_modules\mpromise\lib\promise.js:97:20)
at Promise.resolve (\node_modules\mongoose\lib\promise.js:114:23)