所以我的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);
});
});
});
};
答案 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
}
});