对 Fastify 执行 POST 请求时,未解析 JSON 以进行验证

问题描述

在我的路线中,我有以下内容

const reservationSchema = {
  body: {
    type: 'object',required: ['in','out','guests','language','roomsSelected'],properties: {
      language: {
        type: 'string',},// ... several other property validations here
    }
  }
};

fastify.post(
  '/api/reservations/:slug',{ schema: reservationSchema },reservationsController.addReservation
);

我像这样从 React 发送 POST 请求:

const response = await fetch(process.env.REACT_APP_API_HOSTNAME + '/api/reservations/' + property.slug,{
  method: 'POST',body: JSON.stringify(requestBody)
});

当我查看请求时,我可以看到它正确地发送了 JSON:

screenshot

但是我收到以下回复

{
  "statusCode":400,"error":"Bad Request","message":"body should be object"
}

我是否遗漏了一些东西来自动将 POST 正文解析为 Fastify 中的对象,以便我可以使用验证模式对其进行验证?即使在我的 reservationsController.addReservation() 函数中,我也需要在 JSON.parse() 上手动执行 req.body

解决方法

来自 fetch() 文档:

请求和响应(以及扩展的 fetch() 函数)都将尝试智能地确定内容类型。如果字典中没有设置,请求也会自动设置一个 Content-Type 标头。

但是,(至少在 Chrome 中),当您发送 JSON 字符串时,它不会智能地确定该字符串是 JSON,而是将 Content-Type 标头作为 {{ 1}}。由于服务器收到此 text/plain;charset=UTF-8 标头,因此它假定您正在发送计划文本字符串,因此不会将其解析为 JSON。

要使服务器自动将正文解析为 JSON,您需要确保将 Content-Type 标头设置为 Content-Type。像这样:

application/json

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...