2

我正在为会话身份验证实现一个 restify 中间件。该函数包含嵌套的异步数据库调用:db.sessions.findOne() 回调中的 db.sessions.remove()。

“返回”语句让我感到困惑,因为我不确定我是从回调返回 next() 还是 next(err) 到 verifyUserSession(),还是只是从 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
        }
    });
}
}
4

2 回答 2

2

您使用的回调恰到好处。

return仅用于从当前回调返回。当您调用时,return next(...)您调用回调函数并返回它返回的值。通常只需要返回以确保您不会调用两次回调。

请注意,您需要确保函数中每个可能的分支都会调用回调,否则您的程序将永远不会从verifyUserSession. 在您给出的代码示例中,这发生了两种情况:1)如果会话正常,2)如果req.headers.sessionKey没有设置。您还应该为这些分支添加回调。

于 2012-10-24T07:44:30.003 回答
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;
});

请注意,最后一次返回是不必要的。

于 2012-10-24T09:56:34.737 回答