同时使用Joi和express-validator是一种好习惯吗?

问题描述

express-validator同时执行输入卫生和对象验证,而joi仅执行对象验证。 Joi非常易于验证,我非常喜欢。

我的问题是,同时使用这两个模块是否是一种好习惯?我的直觉说不,我应该像使用w / Node.js一样使用express-validator。

我真的很想对此发表一个社区观点。

解决方法

我认为这有点根据。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...