我应该总是在 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 另一个客户端的错误。