在express中使用csurf,如果验证错误如何获取异常?
发布于 10 年前 作者 friskit-china 5916 次浏览 最后一次编辑是 8 年前

代码如下:

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 回复

求救啊哭。。。

@friskit-china

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的源代码,应该有发现。

回到顶部