问题描述
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:
但是我收到以下回复:
{
"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