首页 > 解决方案 > 同时使用 Joi 和 express-validator 是一个好习惯吗?

问题描述

express-validator 进行输入清理和对象验证,而 joi 只进行对象验证。Joi 很容易用于验证,我非常喜欢。

我的问题是,使用这两个模块是一个好习惯吗?我的直觉说不,我应该只使用 express-validator,因为我正在使用 express w/Node.js。

我真的很想从社区的角度来看待这件事。

标签: node.jsexpressjoiexpress-validator

解决方案


我认为这有点基于意见。

虽然我不使用 express-validator,但我使用celebratewhich 与express-validatorbut celebrateuses类似,它们都是在控制器级别验证数据的验证中间件,如果您有单独的控制器服务层,我认为同时使用andJoi是有意义的,例如:Joiexpress-validator

您的路线(控制器):

app.post('/books', validate([...], async function (req, res) {
  try {
    await BookService.createBook(req.body);
    res.status(201).send();
  } catch (err) {
    
  }
})

并在您的服务文件(BookService)上:

function createBook(data) {
   if (!validateUsingJoi(req.body)) throw new Error();
   BookModel.create(data);
}

正如您在我的示例代码中看到的那样,我进行了 2 次验证,第一次在路由器中间件 ( validate[]) 中,第二次在服务validateUsingJoi()中。

我想这样想:

  1. 路由器中间件验证(使用express-validator/ celebrate)用于指定“此端点需要/接受主体/查询中的 x、y 和 z 数据”
  2. 服务中的验证(使用Joi)用于您的业务逻辑验证,例如书名需要超过 8 个字符等。

但是,如果您使用 Joi 在您的服务层进行了适当的验证,那么路由器中间件验证就不是必需的,而且可能也是多余的,因为无论您传递给端点的数据是什么,无论您是否有路由器中间件验证,它都应该返回相同的结果。不是。


推荐阅读