2016-12-05 284 views
1

我正在尝试合并express-jwt库,但我不太明白它是如何处理错误的。如何使用Express-JWT处理错误

documentation说:

错误处理

的默认行为是当令牌无效抛出一个错误,这样你就可以>添加自定义逻辑如下管理未经授权的访问:

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

但我很困惑如何工作。如果我有一个简单的reqres的情况,并且我想拨打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)  
    })   
}) 

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

+0

如果你考虑的代码'快车jwt' https://github.com/auth0/express-jwt/blob/master/lib/index.js#L51,你会发现它使用'next(err)'和'next'将请求传递给错误处理程序或请求处理程序。 –

+0

所以我不清楚,'next'传递给'expressJwt'函数在哪里? – Startec

+1

在L33上,'middleware'函数具有签名'函数(req,res,next)'。在L130上,返回“中间件”。因此,当您在路由器中传递'expressJwt({})'时,它会返回一个接受快递'req','res'和'next'的函数(req,res,next)。希望对你很清楚:) –

回答

8

另一种方法是,您可以将中间件放在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(); 
}); 
+0

完美地工作,这应该是被接受的答案 –

+0

还要注意你必须把下一个作为该函数的参数,否则它将不会被执行。 – magician11

+0

@ magician11的确有下一个()作为参数。除此之外,你的意思是什么? –