【问题标题】:Is it a good practice to use both Joi and express-validator? [closed]同时使用 Joi 和 express-validator 是一个好习惯吗? [关闭]
【发布时间】:2020-08-28 06:00:55
【问题描述】:

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

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

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

【问题讨论】:

  • 好吧,我根本不使用 express-validator,我只使用 Joi 验证所有请求(正文、参数、查询)。
  • 在我验证数据之前,我正在使用 escape-html 来清理数据。这是一个好习惯吗?

标签: node.js express joi express-validator


【解决方案1】:

我认为这有点基于意见。

虽然我不使用 express-validator,但我使用 celebrate,它与 express-validator 类似,但 celebrate 使用 Joi,它们都是验证中间件,用于验证控制器级别的数据,如果您有单独的controller-service 层,我觉得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 在您的服务层进行了适当的验证,那么路由器中间件验证就不是必需的,而且可能也是多余的,因为无论您传递给端点的数据如何,无论您是否拥有路由器,它都应该返回相同的结果中间件验证与否。

【讨论】:

    猜你喜欢
    • 2017-04-28
    • 2020-08-25
    • 2013-03-30
    • 2015-08-03
    • 1970-01-01
    • 2015-02-18
    • 2016-03-20
    • 2023-01-06
    • 2021-09-21
    相关资源
    最近更新 更多