如何使用Express-JWT处理错误

Sta*_*tec 8 node.js express jwt express-jwt

我正在尝试合并express-jwt库,我不太明白它是如何处理错误的.

文件说:

错误处理

默认行为是在令牌无效时抛出错误,因此您可以>添加自定义逻辑以管理未经授权的访问,如下所示:

    app.use(function (err, req, res, next) {
      if (err.name === 'UnauthorizedError') {
        res.status(401).send('invalid token...');
      }
    });
Run Code Online (Sandbox Code Playgroud)

但我很困惑这是如何工作的.如果我有一个简单的req res情况,并且我想next在令牌有效时调用,或者next如果不是,则调用错误,我在哪里放置该app.use函数?

例如,这是我的代码:

router.post('/', expressJwt({  
  secret: jwtSecret,     
  credentialsRequired: false  
}), (req, res, next) => {   
  databaseController.findUser(req.user.email, (err, user) => {          
    if (err) {          
      return next(err)      
    }                        
    res.json(user)     
  })         
})
Run Code Online (Sandbox Code Playgroud)

err这里将来自我的DB调用,而不是从快递,智威汤逊验证.任何帮助表示赞赏.

Amr*_*ani 20

另一种方法是您可以使用app.use放置中间件来扫描标头或查询字符串中有效jwt的所有路由.可以使用unless关键字免除任何公共端点.例如:

app.use(expressjwt({credentialsRequired: true, secret: config.TOKEN_SECRET, requestProperty: 'user'}).unless({path: config.PUBLIC_URLs}));

app.use(function(err, req, res, next) {
    if(err.name === 'UnauthorizedError') {
      res.status(err.status).send({message:err.message});
      logger.error(err);
      return;
    }
 next();
});
Run Code Online (Sandbox Code Playgroud)

  • 我只想提一下,如果您只想将 expressJwt 包含在一个路由中而不是所有路由中。我将 app.use() 错误函数放在我使用 expressJwt 的路线之后。 (2认同)

小智 6

这是我对个别路线的解决方案。

function UseJwt(){
    return [
        jwtExpress({ secret: configuration.jwtSecret, algorithms: ['HS256'] }),
        function(err, req, res, next){
            res.status(err.status).json(err);
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

用法...

app.get(`/${prefix}/:user_id`,
        ...UseJwt(),
        async function (req, res) {           
           // handle your code here.
        }
)
Run Code Online (Sandbox Code Playgroud)