You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:51:35