2016-07-22 2 views
0

내가 요청을 인증 내 Node.js를 서버의 인증 경로를 가지고있다. 서버 로그에Node.js를 콜백()

var jwt = require('jsonwebtoken'); 
var config = require('./config'); 

module.exports = function(req,res,next){ 
    var bearerHeader = req.headers['authorization']; 
    var token; 
    console.log(bearerHeader); 
    req.authenticated = false; 
    if (bearerHeader){ 
     console.log("11111"); 
     var bearer = bearerHeader.split(" "); 
     token = bearer[1]; 
     jwt.verify(token, config.secret, function (err, decoded){ 
      console.log("22222"); 
      if (err){ 
       console.log(err); 
       req.authenticated = false; 
       req.decoded = null; 
      } else { 
       console.log("33333"); 
       req.decoded = decoded; 
       req.authenticated = true; 
      } 
     }); 
    } 
    next(); 
} 

그러나, 나는 다음과 같은 출력이 나타납니다 : : 여기 auth에 대한 코드는

Bearer jsflkdjlsdfjksodfkjlsdfjkls 
11111 
false 
22222 
33333 

이것은 클라이언트 측의 토큰이 있다는 것을 의미하고, 그 패스입니다 jwt 검증. 그러나 서버는 인증 콜백에서 정보를 반환하기 전에 app.get()을 실행하기로 결정합니다. 뭐라 구요?

+0

당신이 다음() 인증 할 때를 호출하기 전에 5 초 대기를 추가 할 수 있습니다. 로그 쓰기 문제가 아닌지 확인하고 싶습니다. – limbo

+0

@limbo 그냥 했어, 결과는 똑같아. 'jwt.verify()'를 호출하기 전에 실제로 멈추기 때문에 논리는'jwt.verify()'다음의 코드에 즉시 전달됩니다. – db2791

답변

1

좋아요. 문제는 jwt.verify()이 비동기이므로 즉시 처리하지 않습니다. 유일한 방법은 당신도 결과를 가지고 후에 만 ​​next()를 호출이 둘러 보는 :

module.exports = function(req,res,next){ 
    var bearerHeader = req.headers['authorization']; 
    var token; 
    console.log(bearerHeader); 
    req.authenticated = false; 
    if (bearerHeader){ 
     console.log("11111"); 
     var bearer = bearerHeader.split(" "); 
     token = bearer[1]; 
     jwt.verify(token, config.secret, function (err, decoded){ 
      console.log("22222"); 
      if (err){ 
       console.log(err); 
       req.authenticated = false; 
       req.decoded = null; 
       next(); 
      } else { 
       console.log("33333"); 
       req.decoded = decoded; 
       req.authenticated = true; 
       next(); 
      } 
     }); 
    } 
}