2016-07-22 77 views
0

我有我的Node.js服務器上的認證路由認證請求:Node.js的回調()

app.get('/loggedin', auth, function(req, res){ 
    console.log(req.authenticated); 
    res.send(req.authenticated ? req.authenticated: false) 
}) 

據我瞭解,authapp.get()之前運行。下面是auth代碼:

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

在服務器上的日誌,但是,我收到以下輸出:

Bearer jsflkdjlsdfjksodfkjlsdfjkls 
11111 
false 
22222 
33333 

這意味着是在客戶的身邊一個道理,那就是通行證jwt驗證。但是,服務器在完成身份驗證回調中的信息返回之前,決定開始運行app.get()。是什麼賦予了?

+0

你能調用next()進行身份驗證時前加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(); 
      } 
     }); 
    } 
}