在express中使用csurf,如果验证错误如何获取异常?
代码如下:
app.use(csrf());
app.post('/post', function(req, res){
res.send(req.body.test).end();
})
app.get('/', function(req, res){
console.log(req.csrfToken());
res.send('<form method="post" action="/post"><input type="text" name="test"><input type="submit"><input type="hidden" name="_csrf" value="'+req.csrfToken()+'"> </form>');
});
如果表单中不包括_csrf会导致node中一个异常。我想当异常触发则转发到一个错误页面,而不是将异常输出出来。。这个怎么搞?
6 回复
求救啊哭。。。
看csrf中间件源代码中的verifytoken()
函数,当校验失败时,会丢出一个Error
对象:
var err = new Error('invalid csrf token')
err.status = 403
throw err
所以,你要在主程序中加上一个处理Error
的中间件:
app.use(function(err, req, res, next) {
if (err.status && err.status === 403 && err.message && err.message === 'invalid csrf token') {
// your handler
} else {
next(err, req, res);
};
});
总结:看项目的文档和源代码,是解决问题的重要手段。
@bnuhero 看了源码已经解决了……之前翻文档翻不到,发现API reference里头没写,结果后来在guide中找到了……
@bnuhero 搭车再问一下。。。为啥错误处理中间件就要next(err, req, res)而其他的中间件直接next()就行?
@friskit-china 这个是约定
WARNING: TO BE CONFIRMED
next()
- 把控制权传递给下一个可用的中间件,继续处理next(err)
- 传递控制权给下一个可用的处理错误的中间件,继续处理
翻翻Express的源代码,应该有发现。