MongoDB更新文档字段时字符串自动转为对象的问题求助
问题解决:MongoDB更新字段被转为对象而非字符串
问题根源
你遇到的问题是axios默认的请求体序列化逻辑导致的:当直接传入字符串作为请求体发送PUT请求时,axios会自动将其包装成{ string: "你的输入内容" }格式的对象。尽管你在后端用TypeScript断言req.body as string,但运行时req.body实际是这个包装后的对象,最终存入MongoDB的character_name就变成了对象形式。
解决方案
最直接且通用的修复方式是将请求体包装为对象发送,后端对应解析对象中的字段:
1. 修改前端请求代码
把字符串包装成带字段的对象,让axios按正常JSON格式序列化:
export function changeName(name: string){ // 将字符串封装为对象发送 return axios.put(`${baseUrl}/change-name`, { name }) .then(res => res.data); }
2. 修改后端路由代码
从req.body中正确提取name字段,而非直接断言req.body为字符串:
routes.put("/change-name", async (req, res) => { // 解构获取name字段 const { name } = req.body; try { const client = await getClient(); const result = await client.db().collection<Account>('accounts').updateOne( { username: "AndrewDamas" }, {$set: {character_name: name}} ); if (result.modifiedCount === 0) { res.status(404).json({ message: "Not Found" }); } else { res.json({ name }); } } catch (err) { console.error("FAIL", err); res.status(500).json({ message: "Internal Server Error" }); } });
可选方案(不推荐)
如果一定要发送纯字符串请求体,需要手动设置axios的请求头并让后端解析文本:
- 前端:
export function changeName(name: string){ return axios.put(`${baseUrl}/change-name`, name, { headers: { 'Content-Type': 'text/plain' } }) .then(res => res.data); }
- 后端:需要额外配置Express解析文本请求体(比如使用
express.text()中间件),然后直接用req.body作为字符串。但这种方式兼容性差,不如传对象的方式通用。
内容的提问来源于stack exchange,提问作者Andrew Damavoletes
相关产品推荐
相关产品推荐

