客户端向Fastify后端发送PUT请求无响应无报错如何解决
问题根因
- 客户端请求体格式不符合要求:你指定了
Content-Type: application/json请求头,但直接把firstName纯字符串传给了请求体,没有按照User模型的结构序列化为JSON对象,后端拿到的request.body无效,自然无法完成更新。 - 后端
findByIdAndUpdate配置缺失:默认该方法返回更新前的旧文档,且会跳过模型字段校验,即使数据更新成功前端也可能拿到旧数据,无法判断更新结果。 - Postman可以正常调用是因为你在工具中填写了符合要求的JSON结构请求体,和客户端的错误请求格式不一致。
修复步骤
1. 调整客户端请求代码
修改fetch的body参数,按照你的用户数据结构序列化为JSON:
const editUser = async () => { try { const res = await fetch(`http://<myIPaddr>:5000/api/users/${item._id}`, { method: "PUT", headers: { Accept: "application/json", "Content-Type": "application/json", }, // 按照你的User模型结构构造数据并序列化 body: JSON.stringify({ name: [{ firstName: firstName }] }), }); // 添加响应处理,方便排查错误 const result = await res.json(); console.log('更新结果', result); console.log(firstName); } catch (error) { console.log(error); } };
2. 调整后端路由代码
给findByIdAndUpdate添加配置项,可选新增日志和错误信息方便排查:
fastify.put("/:id", async (request, reply) => { try { // 可选:添加日志确认收到的请求体 console.log('收到的请求数据', request.body); const { id } = request.params; const user = await User.findByIdAndUpdate(id, request.body, { new: true, // 返回更新后的最新文档 runValidators: true // 开启模型字段校验,避免非法数据写入 }); if (!user) { return reply.status(400).send({ error: "couldn't find user" }); } reply.status(200).send({ success: true, data: user }); } catch (error) { reply.status(400).send({ error: "request failed", msg: error.message }); } });
内容的提问来源于stack exchange,提问作者Eric Pezzulo
相关产品推荐
相关产品推荐

