gpt4 book ai didi

node.js - 向 Fastify 发出 POST 请求时,JSON 未被解析以进行验证

转载 作者:行者123 更新时间:2023-12-05 01:30:42 26 4
gpt4 key购买 nike

在我的 route ,我有以下内容:

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() 函数中,我也需要在 req.body 上手动执行 JSON.parse()

最佳答案

来自fetch()文档:

Both request and response (and by extension the fetch() function), will try to intelligently determine the content type. A request will also automatically set a Content-Type header if none is set in the dictionary.

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

要使服务器自动将正文解析为 JSON,您需要确保将 Content-Type header 设置为 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)
});

关于node.js - 向 Fastify 发出 POST 请求时,JSON 未被解析以进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66875913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com