gpt4 book ai didi

javascript - MEAN CRUD 错误崩溃无法设置 header

转载 作者:行者123 更新时间:2023-11-28 08:41:11 26 4
gpt4 key购买 nike

所以我的 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 route 错误地多次使用 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) 从而触发两个响应,并导致您看到在发送响应 header 后无法设置响应 header 的错误。我认为您可以通过使用实际的 else 语句来修复您的代码,以确保您不会发送两个响应。

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

});

关于javascript - MEAN CRUD 错误崩溃无法设置 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20478057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com