Node,Mongo,Mongoos - 发送后无法设置标头

时间:2017-06-27 14:09:55

标签: node.js mongodb angular express

我在使用一个简单的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);
    });
});

我不知道错误的起源在哪里。

1 个答案:

答案 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);
    });
});