处理可组合中间件中的Express-JWT错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理可组合中间件中的Express-JWT错误相关的知识,希望对你有一定的参考价值。

我正在为每个API实现JWT授权,如下所示:

auth.js

import expressJwt from 'express-jwt';
import compose from 'composable-middleware';

var validateJwt = expressJwt({
  secret: config.secrets.session
});

function isAuthenticated() {
    return compose()

    .use(function(req, res, next) {
       validateJwt(req, res, next);
    })
    .use(function(req, res, next) {

    User.find({
            where: {
         id: req.user.id
            }
    }).then(function(user){

            //Handle User
        }).catch(function(err){
            //Handle DB Error
        });
    });
}

index.js

import auth from '../../auth';
import express from 'express';
import controller from './user_group.controller';
import * as validators from './user_group.validations';

// Create router object
const router = express.Router();

// Get all user groups
router.get('/', [auth.isAuthenticated(), validators.index], controller.index);

除了JWT的错误处理之外,一切都工作得很好。我不理解validateJwt(req, res, next);函数如何在移动到下一个中​​间件之前处理Unauthorized Error stack

答案

我用以下方法完成了它:

.use(function(err, req, res, next) {

  if(err) {
    return res.status(constants.INVALID_OR_NO_ACCESS_TOKEN.code).json({
      status: 'error',
      code: constants.INVALID_OR_NO_ACCESS_TOKEN.code,
      message: constants.INVALID_OR_NO_ACCESS_TOKEN.message
    }).end();
  }
  User.find({
    where: {
      id: req.user.id
    }
  })
另一答案

您可以在validateJwt之后添加另一个.use

return compose()
       .use(function(req,res,next){
             validateJwt(req, res, next);
            })
        .use(function(err, req,res,next){
                if(err){
                 //here you will catch the error generated by the validateJWT
                 // eg: return res.status(401).json(err.message);
                 // or: return next(err);
                 }
                 else{
                    next();
                 }

             })

以上是关于处理可组合中间件中的Express-JWT错误的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 RS256 加密的 express-jwt 在应用程序路由上解码 JWT 令牌会引发未经授权的错误

Express-jwt 中间件打字稿类型问题

使用 express-jwt,我可以返回 401 以外的其他状态码吗?

运行测试时如何优雅地跳过 express-jwt 中间件?

受保护路由的 jest.mock express-jwt 中间件行为

类型错误:expressJwt 不是函数