MEAN CRUD错误崩溃无法设置标头

时间:2013-12-09 18:36:57

标签: javascript mongodb mongoose crud

所以我的CRUD应用程序此时做了两件事,一直发送一个无限的空列表。但不仅如此,当我尝试删除某些内容时,我收到此错误...请跳转下面的api代码。此外,如果你看到任何可能有助于无限列表lemme知道。

C:\Users\\Desktop\Todo List\node_modules\mongoose\lib\utils.js:419
        throw err;
              ^
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:691:11)
    at ServerResponse.res.setHeader (C:\Users\\Desktop\Todo List\node_modul
es\express\node_modules\connect\lib\patch.js:63:22)
    at ServerResponse.res.set.res.header (C:\Users\\Desktop\Todo List\node_
modules\express\lib\response.js:526:10)
    at ServerResponse.res.json (C:\Users\\Desktop\Todo List\node_modules\ex
press\lib\response.js:193:36)
    at Promise.<anonymous> (C:\Users\\Desktop\Todo List\routes\api.js:45:21
)
    at Promise.<anonymous> (C:\Users\\Desktop\Todo List\node_modules\mongoo
se\node_modules\mpromise\lib\promise.js:162:8)
    at Promise.EventEmitter.emit (events.js:95:17)
    at Promise.emit (C:\Users\\Desktop\Todo List\node_modules\mongoose\node
_modules\mpromise\lib\promise.js:79:38)
    at Promise.fulfill (C:\Users\\Desktop\Todo List\node_modules\mongoose\n
ode_modules\mpromise\lib\promise.js:92:20)
    at C:\Users\\Desktop\Todo List\node_modules\mongoose\lib\query.js:1736:
26

路由api代码

var Todo = require('../app/models/todos').Todo;

   exports.read = function(req, res) {

        // use mongoose to get all todos in the database
        Todo.find(function(err, todos) {

            // if there is an error retrieving, send the error. nothing after res.send(err) will execute
            if (!err)
                res.send(err)

            res.json(todos); // return all todos in JSON format
        });
    };

    // create todo and send back all todos after creation
   exports.create = function(req, res) {

        // create a todo, information comes from AJAX request from Angular
        Todo.create({text : req.body.text}, function(err, todos) {
            if (err)
                res.send(todos);

            // get and return all the todos after you create another
            Todo.find(function(err, todos) {
                if (err)
                    res.send(err)
                res.json(todos);
            });
        });

    };

    // delete a todo
   exports.delete = function(req, res) {
        Todo.remove({_id : req.params._id
        }, function(err, todos) {
            if (err)
                res.send(todos);

            // get and return all the todos after you create another
            Todo.find(function(err, todos) {
                if (err)
                    res.send(err)
                res.json(todos);
            });
        });
    };

    //Update a todo
    exports.update = function(req, res) {
        Todo.findById(req.params._id, function(err, todos){
            todos.text = req.body.text;
            console.log(todos);
            todos.save(function() {
                if (!err) {
                    res.send(todos);
                } else if (err) {
                    res.send(err);
                }

                Todo.find(function(err, todos) {
                    if (err)
                        res.send(err)
                    res.json(todos);
                });
            });
        });
    };

1 个答案:

答案 0 :(得分:0)

我错误地在Express路线中多次使用res时,通常会看到此错误。确保在路由处理程序(函数)中只使用res一次。

例如

app.get('/foo', doFoo);

function doFoo(req, res) {
  res.send('foo');
  res.send('bar');
}

将无效,因为您尝试使用res两次,如果我没有弄错的话,内部调用res.end()

编辑:事实证明,我认为我的代码中存在问题。

// create a todo, information comes from AJAX request from Angular
Todo.create({text : req.body.text}, function(err, todos) {
    if (err)
        res.send(todos);

    // get and return all the todos after you create another
    Todo.find(function(err, todos) {
        if (err)
            res.send(err)
        res.json(todos);
    });
});

如果您第一次拨打res.send(todos)时收到错误,则表示您使用Todo.create。假设您在此处收到错误,您的代码仍会尝试Todo.find。一旦发生这种情况,它将尝试res.json(todos),从而触发两个响应并导致您看到的错误,即在它们已经发送后无法设置响应标头。我认为您可以使用实际的else语句来修复代码,以确保您不会发送两个响应。

    Todo.create({text:req.body.text}, function(err, todos){
      if (err) {...}
      else {
        .. your else code here
      }

});