2016-07-22 79 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(); 
      } 
     }); 
    } 
}