【问题标题】:AJV doesn't validate my body with the function returned by compileAJV 不使用 compile 返回的函数验证我的身体
【发布时间】:2020-10-12 18:18:34
【问题描述】:

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

我正在使用 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 永远不会验证我的身体并说缺少foobar,但是如果我删除所需的参数它可以工作,但是如果我为参数foobar 输入一个数字而不是字符串,它会验证我的身体...

为了使其按预期工作,我必须不调用 compile 返回的函数而是调用:

ajv.validate(schema, req[data])

这样一来,编译功能就没有用了,而且我害怕性能(缓存,或为每个请求编译)。 使用compile返回的函数是不是我犯了错误?我怎样才能让它以这种方式工作?因为它以一种方式运行良好但另一种方式运行良好,这非常奇怪......

感谢您的帮助

【问题讨论】:

  • 谢谢,这篇看似无趣的帖子实际上以你无法想象的方式帮助了我!现在我知道你可以在 Express 中有多个 (req, res, next) 处理程序:)
  • 对这种方法印象深刻 - 我将这种方法与 TS 和 ts-json-schema-generator 结合使用,它使我能够如此快速地验证我的根源 - 非常感谢跨度>

标签: javascript node.js express ajv


【解决方案1】:

compile返回的函数参数与ajv.validate不同,不需要de指定schema。

我只需要拨打:validate(req[data] 就可以了。

【讨论】:

    猜你喜欢
    • 2019-07-24
    • 1970-01-01
    • 2019-05-30
    • 2016-08-23
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多