JSON не анализируется для проверки при выполнении запроса POST для Fastify

В моих маршрутах у меня есть следующее:

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
);

Я отправляю запрос POST от React следующим образом:

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

Я вижу, что он правильно отправляет JSON, когда я смотрю на запрос:

скриншот

Однако я получаю следующий ответ:

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

Я что-то упустил для автоматического анализа тела POST как объекта в Fastify, чтобы я мог проверить его с помощью схемы проверки? Даже в моей функции reservationsController.addReservation() мне нужно вручную выполнить JSON.parse() на req.body.


person Mike    schedule 30.03.2021    source источник


Ответы (1)


Из документов fetch():

И запрос, и ответ (и, соответственно, функция fetch()) попытаются разумно определить тип содержимого. Запрос также автоматически установит заголовок Content-Type, если он не установлен в словаре.

Однако (по крайней мере, в Chrome), когда вы отправляете строку JSON, он не определяет разумно, что эта строка является JSON, а вместо этого отправляет заголовок Content-Type как text/plain;charset=UTF-8. Поскольку сервер получает этот заголовок Content-Type, он предполагает, что вы отправляете текстовую строку плана, и поэтому не анализирует ее как JSON.

Чтобы сервер автоматически анализировал тело как JSON, вам необходимо установить для заголовка Content-Type значение application/json. Как это:

const response = await fetch(process.env.REACT_APP_API_HOSTNAME + '/api/reservations/' + property.slug, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(requestBody)
});
person Mike    schedule 30.03.2021