NodeJS 我应该总是在express中编译Ajv模式吗?

zsbz8rwp  于 2023-08-04  发布在  Node.js
关注(0)|答案(3)|浏览(132)

我想使用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)

字符串
当我的端点被调用时,我应该总是编译验证器,并将其包含在我的路由中,还是我可以将编译过程留在路由体之外?

bmvo0sr5

bmvo0sr51#

在试用了Josh Wulf的答案之后,我确认它可以在路由处理程序之外编译验证器。
虽然它可以按预期工作,并且可以在路由处理程序之外编译,但我注意到它有一个缺点。
知道验证器检测到哪些错误的方法是调用validate.errors

var validate = ajv.compile(schema);
var valid = validate(data);

if (!valid) {
  console.log(validate.errors);
}

字符串
正因为如此,我们不应该在路由处理程序之外编译验证器,因为可能会有并发问题。
由于对同一路由的不同请求的验证器是相同的,因此访问验证器的errors属性可能会返回另一个客户端的错误。

oprakyz7

oprakyz72#

您应该在路由处理程序之外编译它一次,然后在处理程序中重用编译后的模式。
这将提高性能-您只需要在它更改时编译它。

uinbv5nw

uinbv5nw3#

我认为我们应该编译它一次,然后在处理程序中重用编译后的模式。
乍一看,它可能会导致并发问题,但它不是导致并发问题async方法。

相关问题