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

MEAN CRUD error crash cant set headers

本文关键字:设置 CRUD 错误 崩溃 MEAN      更新时间:2024-06-09

所以我的CRUD应用程序此时做了两件事,不断发送一个无限的空列表。但不仅如此,当我试图删除某些内容时,我会遇到这个错误。。。跳到下面获取api代码。此外,如果你看到任何可能有助于无限列表的东西,请告诉我。

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

当我在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);
    });
});

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

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