跳到主要内容
CNode

在express中使用csurf,如果验证错误如何获取异常?

社区
Ffriskit-china发布于 12 年前最后回复 12 年前
668610

代码如下:

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)

B
bnuhero#612 年前
引用 friskit-china求救啊哭。。。

@friskit-china

WARNING: TO BE CONFIRMED

  • next() - 把控制权传递给下一个可用的中间件,继续处理
  • next(err) - 传递控制权给下一个可用的处理错误的中间件,继续处理

翻翻Express的源代码,应该有发现。

R
ravenwang#512 年前
引用 friskit-china求救啊哭。。。

@friskit-china 这个是约定

F
friskit-china#412 年前
引用 friskit-china求救啊哭。。。

@bnuhero 搭车再问一下。。。为啥错误处理中间件就要next(err, req, res)而其他的中间件直接next()就行?

F
friskit-china#312 年前
引用 friskit-china求救啊哭。。。

@bnuhero 看了源码已经解决了……之前翻文档翻不到,发现API reference里头没写,结果后来在guide中找到了……

B
bnuhero#212 年前
引用 friskit-china求救啊哭。。。

@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);
  };
});

总结:看项目的文档和源代码,是解决问题的重要手段。

F
friskit-china#112 年前

求救啊哭。。。

参与回复

登录后即可参与回复。登录