我正在实现一个用于会话身份验证的restify中间件。函数包含db.sessions.findone()回调函数中的嵌套异步DB调用:db.sessions.remove()。
return语句让我很困惑,因为我不确定是从回调返回到verifyusersession()的next()还是next(err),还是只是从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
        }
    });
}
}

最佳答案

你用回拨就对了。
return仅用于从当前回调返回。当调用return next(...)时,调用回调函数并返回它返回的值。通常只需要返回以确保不会调用两次回调。
请注意,您需要确保函数中的每个可能分支都将调用回调,否则您的程序将永远不会从verifyUserSession继续。在您给出的代码示例中,会发生两种情况:1)如果会话正常,2)如果未设置req.headers.sessionKey。您还应该为这些分支添加回调。

07-26 04:44
查看更多