【发布时间】:2012-09-28 20:37:59
【问题描述】:
我有一个带有用户对象的 mongob。这是架构:
{
"_id": {
"$oid": "50658c835b821298d3000001"
},
"email": "admin",
"password": "admin",
"id": 1
}
我写了一个简单的演示(只有主要部分):
function findByEmail(email, callback) {
db.collection("users", function(err, collection) {
collection.find({}, function(err, users) {
users.each(function(err, user) {
if (user) {
if (user.email === email) {
//for a case, is we found user - return it
callback(null, user);
}
}
});
//for a case, is we didn't find user - return null
callback(null, null);
});
});
}
还有一条测试路线:
app.get('/test',function(req,res){
findByEmail("admin", function(err, user){
res.send(user);
})
})
启动 localhost:3000/test 后我得到
Error: Can't set headers after they are sent.
如果我评论callback(null, null); 行,我不会收到此错误。似乎回调有效......两次!怎么可能?我想如果我if (user.email === email) { ... } 工作,并且callback(null, user); 启动,函数findbyEmail 将<user> 返回到app.get,但即使if (user.email === email) { ... } 为真,回调也会工作两次(也适用于callback(null, null);)。
【问题讨论】:
-
那么,什么会阻止
callback(null, null)被调用?您在迭代users数组后立即调用它,这是无条件发生的。 -
又一个回调!回调(空,用户); - 如果我们找到用户,回调(空,用户);被调用,并将执行定向到 app.get。这就像一个返回/休息。或不? o_O
-
不,回调是函数。当你调用一个函数时,好吧,你调用了一个函数。之后你的执行将继续,就像你调用一个函数之后一样。
-
嗯,我以错误的方式考虑了回调。那么,您如何建议我直接执行 app.get?与“返回”?还是使用'break'?
-
尝试使用“return callback(null, user);”仍然得到错误:发送后无法设置标题。