node.js - 同时使用 Joi 和 express-validator 是一个好习惯吗?
问题描述
express-validator 进行输入清理和对象验证,而 joi 只进行对象验证。Joi 很容易用于验证,我非常喜欢。
我的问题是,使用这两个模块是一个好习惯吗?我的直觉说不,我应该只使用 express-validator,因为我正在使用 express w/Node.js。
我真的很想从社区的角度来看待这件事。
解决方案
我认为这有点基于意见。
虽然我不使用 express-validator,但我使用celebrate
which 与express-validator
but celebrate
uses类似,它们都是在控制器级别验证数据的验证中间件,如果您有单独的控制器服务层,我认为同时使用andJoi
是有意义的,例如:Joi
express-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()
中。
我想这样想:
- 路由器中间件验证(使用
express-validator
/celebrate
)用于指定“此端点需要/接受主体/查询中的 x、y 和 z 数据” - 服务中的验证(使用
Joi
)用于您的业务逻辑验证,例如书名需要超过 8 个字符等。
但是,如果您使用 Joi 在您的服务层进行了适当的验证,那么路由器中间件验证就不是必需的,而且可能也是多余的,因为无论您传递给端点的数据是什么,无论您是否有路由器中间件验证,它都应该返回相同的结果。不是。