AJV 未使用编译返回的函数验证我的 body

AJV doesn't validate my body with the function returned by compile

我正在用 express 构建一个 API,我使用 AJV 作为中间件来验证发送的 body。

我正在使用 AJV 6.12.6

这是我在 JSON body-foobar 中的架构。json:

{
  "type": "object",
  "properties": {
    "foobar": {
      "type": "string"
    }
  },
  "required": ["foobar"]
}

这里是我使用中间件的方式:

const validator = require('../../middleware/validator')
const schema = require('../../middleware/schema/body-foobar.json')
...

router.post('/foo', validator(schema, 'body'), post.handler)

最后是我的中间件:

const Ajv = require('ajv')


module.exports = (schema, data) => {
  const ajv = new Ajv()
  const validate = ajv.compile(schema)

  return (req, res, next) => {
    const validation = validate(schema, req[data])

    if (!validation) {
      return res.status(400).json({success: validation, error: validate.errors[0].message})
    }
    return next()
  }
}

使用此代码,AJV 永远不会验证我的 body 并说 foobar 丢失但是有,如果我删除必需的参数它可以工作但是如果我输入数字而不是字符串对于参数 foobar 它将验证我的 body...

为了让它按预期工作,我必须不调用编译返回的函数,而是调用:

ajv.validate(schema, req[data])

这样一来,编译功能就没用了,我怕性能(缓存,或者每次请求都编译)。 我是不是用compile返回的函数搞错了?我怎样才能让它以这种方式工作?因为它以一种方式运行良好而另一种方式运行不正常,这太奇怪了...

感谢您的帮助

编译返回的函数参数与ajv.validate不同,无需指定架构。

我只需要调用:validate(req[data] 它工作正常。