问题描述
express-validator同时执行输入卫生和对象验证,而joi仅执行对象验证。 Joi非常易于验证,我非常喜欢。
我的问题是,同时使用这两个模块是否是一种好习惯?我的直觉说不,我应该像使用w / Node.js一样使用express-validator。
我真的很想对此发表一个社区观点。
解决方法
我认为这有点根据。
虽然我不使用express-validator,但我使用的celebrate
与express-validator
类似,但是celebrate
使用Joi
,它们都是验证数据的验证中间件在控制器级别,如果您具有单独的控制器服务层,那么我认为同时使用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在服务层中进行了正确的验证,则路由器中间件验证也就没有必要,而且可能也很多余,因为无论传递给端点的数据如何,无论您是否拥有路由器,它都应返回相同的结果是否进行中间件验证。