我正在实施一个用于会话身份验证的restify中间件。该函数包含嵌套的异步db调用:db.sessions.findOne()的回调中的db.sessions.remove()。
'返回'语句令我困惑,因为我不确定我是从返回到verifyUserSession()返回next()还是next(错误),还是只是从verifyUserSessions返回?我这样做了吗?
function verifyUserSession(req, res, next) {
if (req.headers.sessionKey)
{
db.sessions.findOne(req.headers.sessionKey, function(err, session) {
if (err)
{
return next(err);
}
if (!session)
{
return next(new Error({'message': 'Session does not exist'}));
}
if ((new Date().getTime() - session.timestamp.getTime())/86400000 > 60)
{
db.sessions.remove({sessionKey: req.headers.sessionKey}, function(err){
if (err)
{
return next(err);
}
return next(new Error({'message': 'Session expired'}));
});
}
else
{
// session ok
}
});
}
}
答案 0 :(得分:2)
你正在使用恰到好处的回调。
return
仅用于从当前回调中返回。当你调用return next(...)
时,你调用回调函数并返回它返回的值。通常只需要返回以确保您不会两次调用回调。
请注意,您需要确保函数中的每个可能的分支都会调用回调,否则您的程序将永远不会从verifyUserSession
继续。在代码示例中,您给出了两种情况:1)如果会话正常,2)如果未设置req.headers.sessionKey
。您还应该为这些分支添加回调。
答案 1 :(得分:1)
异步编码中的返回语句仅使用 ,因为它们会中断块代码的进一步执行。基本上这个:
db.sessions.remove({sessionKey: req.headers.sessionKey}, function(err){
if (err)
{
return next(err);
}
return next(new Error({'message': 'Session expired'}));
});
相当于:
db.sessions.remove({sessionKey: req.headers.sessionKey}, function(err){
if (err)
{
next(err);
return;
}
next(new Error({'message': 'Session expired'}));
return;
});
请注意,最后一次返回是不必要的。