I'm building an API with express and I use AJV as a middleware to validate the body which is sent.
I'm using AJV 6.12.6
This is my schema in JSON body-foobar.json:
{
"type": "object",
"properties": {
"foobar": {
"type": "string"
}
},
"required": ["foobar"]
}
Here the way I use the middleware:
const validator = require('../../middleware/validator')
const schema = require('../../middleware/schema/body-foobar.json')
...
router.post('/foo', validator(schema, 'body'), post.handler)
And finally my middleware:
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()
}
}
With this code, AJV never validates my body and says that foobar
is missing but there is, if I remove the required parameter it works but if I put a number instead of a string for the param foobar
it will validate my body...
To make it works as expected, I have to not call the function returned by compile but call:
ajv.validate(schema, req[data])
This way, it makes the compile function useless, and I'm afraid of performances (cached, or compile for each request). Did I make a mistake by using the function returned by compile? How can I make it works this way? Because it's super weird that it works well one way but not the other ...
Thank you for your help
The function returned by compile has different parameters than
ajv.validate
and no need de specify the schema.I just need to call:
validate(req[data]
and it's working fine.