【发布时间】: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