繁体   English   中英

当 fastify 请求正文中缺少不同的值时,AJV 验证不会返回多个错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM