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)