[英]AJV validation doesn't return multiple errors when different values are missing in the fastify request body
我有一个带有 post 端点的 fastify 服务器。 它接受带有验证的 JSON 请求正文。 服务器代码如下:
const fastify = require("fastify");
const server = fastify({
ajv: {
customOptions: {
allErrors: true,
},
},
logger: true,
});
const schema = {
schema: {
body: {
type: "object",
properties: {
data: {
type: "array",
items: {
type: "object",
properties: {
foo: {
type: "string",
},
bar: {
type: "string",
},
},
required: ["foo", "bar"],
},
},
},
required: ["data"],
},
},
};
server.post("/", schema, function (request, reply) {
console.log({
request: {
body: JSON.stringify(request.body),
},
});
reply.send({ message: "hello" });
});
server.listen(3000, function (err, address) {
if (err) {
fastify.log.error(err);
process.exit(1);
}
console.log(`server listening on ${address}`);
});
下面是一个有效的请求正文。
{ "data":[{ "bar": "bar exists", "foo": "foo exists" }]}
当我尝试访问缺少输入的多个值的同一服务器时,即,
{ "data":[{ "bar": "bar exists, foo missing" }, {}] }
我收到以下回复。
{
"statusCode": 400,
"error": "Bad Request",
"message": "body.data[0] should have required property 'foo', body.data[1] should have required property 'foo', body.data[1] should have required property 'bar'"
}
我想分别获取每个错误,而不是获取单个大错误消息,因为此请求可以 go 非常大。 我尝试了一些关于 ajv 选项的试验,但找不到任何东西。 任何帮助表示赞赏。 干杯:)
捕获到错误后,您需要有一个自定义解析器。
为了实现这种方法,有一个名为setErrorHandler
的方法。
根据 Fastify 文档:
设置一个 function 将在发生错误时调用。
这是一个简单的解析器,但您可能需要根据自己的喜好对其进行更改:
server.setErrorHandler(function (error, request, reply) {
if (error.validation) {
reply.status(400).send({
statusCode: error.statusCode,
error: 'Bad Request',
message: error.validation.map(err => `${err.instancePath} ${err.message}`)
});
}
})
// rest of code
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.