我想使用Ajv validator来验证我的express
应用的请求正文。
要使用验证器,我们首先需要编译要测试的模式,然后运行验证,如下所示:
const Ajv = require('Ajv');
const ajv = new Ajv();
const schema = {
type: 'object',
required: ['username', 'password'],
properties: {
username: {
type: 'string',
minLength: 3,
},
password: {
type: 'string',
minLength: 8,
},
},
};
/* What we want to validate */
const body = {
username: 'johndoe',
password: 'secret'
};
/* We compile the validator */
const validate = ajv.compile(schema.query)
/* We test our data to see if it is valid */
const valid = validate(body)
字符串
当我的端点被调用时,我应该总是编译验证器,并将其包含在我的路由中,还是我可以将编译过程留在路由体之外?
3条答案
按热度按时间bmvo0sr51#
在试用了Josh Wulf的答案之后,我确认它可以在路由处理程序之外编译验证器。
虽然它可以按预期工作,并且可以在路由处理程序之外编译,但我注意到它有一个缺点。
知道验证器检测到哪些错误的方法是调用
validate.errors
:字符串
正因为如此,我们不应该在路由处理程序之外编译验证器,因为可能会有并发问题。
由于对同一路由的不同请求的验证器是相同的,因此访问验证器的
errors
属性可能会返回另一个客户端的错误。oprakyz72#
您应该在路由处理程序之外编译它一次,然后在处理程序中重用编译后的模式。
这将提高性能-您只需要在它更改时编译它。
uinbv5nw3#
我认为我们应该编译它一次,然后在处理程序中重用编译后的模式。
乍一看,它可能会导致并发问题,但它不是导致并发问题的
async
方法。