我应该总是在 express 中编译 Ajv 模式吗?
Should I always compile Ajv schema in express?
我想使用 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)
我是否应该在调用端点时始终编译验证器,以便将其包含在我的路由中,或者我是否可以将编译过程留在路由主体之外?
您应该在路由处理程序之外编译一次,然后在处理程序中重用已编译的架构。
这将提高性能 - 您只需在更改时编译它。
在尝试了 Josh Wulf 的回答后,我确认它可以在路由处理程序之外编译验证器。
虽然它按预期工作并且可以在路由处理程序之外进行编译,但我注意到它有一个缺点。
了解验证器检测到哪些错误的方法是调用 validate.errors
:
var validate = ajv.compile(schema);
var valid = validate(data);
if (!valid) {
console.log(validate.errors);
}
正因为如此,我们不应该在路由处理程序之外编译验证器,因为可能会出现并发问题。
由于验证器在对同一路由的不同请求中是相同的,因此访问验证器的 errors
属性 可能 return 另一个客户端的错误。
我想使用 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)
我是否应该在调用端点时始终编译验证器,以便将其包含在我的路由中,或者我是否可以将编译过程留在路由主体之外?
您应该在路由处理程序之外编译一次,然后在处理程序中重用已编译的架构。
这将提高性能 - 您只需在更改时编译它。
在尝试了 Josh Wulf 的回答后,我确认它可以在路由处理程序之外编译验证器。
虽然它按预期工作并且可以在路由处理程序之外进行编译,但我注意到它有一个缺点。
了解验证器检测到哪些错误的方法是调用 validate.errors
:
var validate = ajv.compile(schema);
var valid = validate(data);
if (!valid) {
console.log(validate.errors);
}
正因为如此,我们不应该在路由处理程序之外编译验证器,因为可能会出现并发问题。
由于验证器在对同一路由的不同请求中是相同的,因此访问验证器的 errors
属性 可能 return 另一个客户端的错误。