2012-10-24 57 views
1

我正在實施會話身份驗證的restify中間件。該函數包含嵌套的異步數據庫調用:db.sessions.findOne()的回調中的db.sessions.remove()。Node.js/Mongojs嵌套數據庫回調返回

'return'語句令我感到困惑,因爲我不確定是否將回調函數的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 
     } 
    }); 
} 
} 

回答

1

您正在使用回調。

return僅用於從當前回調中返回。當您致電return next(...)時,您將調用回調函數並返回它返回的值。退貨通常只用於確保您不會調用回調兩次。

請注意,您需要確保函數中的每個可能的分支都會調用回調函數,否則您的程序將永遠不會從verifyUserSession開始執行。在代碼示例中,您給出了兩種情況:1)如果會話正常,2)如果未設置req.headers.sessionKey。你也應該爲這些分支添加回調。

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; 
}); 

注意,最後回報是不必要的。