2012-10-24 3 views
1

세션 인증을위한 미들웨어를 구현 중입니다. 이 함수에는 db.sessions.findOne()의 콜백 내에서 db.sessions.remove() 중첩 비동기 db 호출이 포함됩니다.Node.js/Mongojs 중첩 db 콜백 return

콜백에서 verifyUserSession()으로 next() 또는 next (err)를 반환 할 것인지 확실하지 않거나 verifyUserSessions에서 반환하는 것인지 확실하지 않기 때문에 'return'문이 혼란 스럽습니까? 이 일을 제대로하고 있습니까?

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) 세션이 ok 인 경우 2) req.headers.sessionKey이 설정되지 않은 경우입니다. 이 브랜치에 대해서도 콜백을 추가해야합니다.

1

비동기 코딩의 return 문은 블록 코드의 추가 실행을 방해하므로 만 사용됩니다. 기본적으로이 : 마지막 반환 불필요하다고

db.sessions.remove({sessionKey: req.headers.sessionKey}, function(err){ 
    if (err) 
    { 
     next(err); 
     return; 
    } 
    next(new Error({'message': 'Session expired'})); 
    return; 
}); 

참고 :

db.sessions.remove({sessionKey: req.headers.sessionKey}, function(err){ 
    if (err) 
    { 
     return next(err); 
    } 
    return next(new Error({'message': 'Session expired'})); 
}); 

은 동일합니다.