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

Node.js后端处理MongoDB返回urlPath数组JSON格式方法

问题原因

你存入MongoDB的urlPath字段值本身就是JSON字符串数组,不是嵌套对象数组,所以查询返回的结果会带转义符。根因是前端提交时对每个url对象做了JSON.stringify()转字符串操作,后端拿到数据后未做解析直接写入数据库,导致存储类型不符合预期。

后端修复方案

不需要调整前端代码,仅需在Controller层写入数据库前,把前端传的JSON字符串数组解析为JS对象数组即可,修改后的Controller代码如下:

exports.addUrl = asyncHandler(async (req, res, next) => {
  const urls = Object.assign({},req.body)
  const email=req.params.email;
  console.log(email)
  const{users}=urls

  // 新增:解析前端传的JSON字符串为对象,加容错避免非法JSON报错
  const parsedUsers = Array.isArray(users) ? users.map(item => {
    if (typeof item !== 'string') return item
    try {
      return JSON.parse(item)
    } catch (err) {
      return item
    }
  }) : []

  if (urls) {
    console.log('url exists')
    Resume.findOneAndUpdate(
      {
        email,
      },
      // 替换为解析后的对象数组写入
      { $push: { urlPath: { $each: parsedUsers } } },    
      {
        new: true,
        fields: {
          urlPath : 1,
        },
      }
    ).exec((err, results) => {    
      if (err) throw err;
      res.json(results);
      console.log('Submitted successfully!')     
    });
  }
});

修改后新写入的数据就会是你预期的对象数组格式,查询返回的JSON不会再有转义符。

历史脏数据修复

如果数据库中已经存在之前写入的字符串格式urlPath数据,可以执行一次性批量更新脚本把存量数据转成对象格式:

// 执行一次即可,修复完成后可删除
Resume.updateMany(
  { "urlPath": { $type: "string" } },
  [{
    $set: {
      "urlPath": {
        $map: {
          input: "$urlPath",
          in: {
            $cond: [
              { $eq: [{ $type: "$$this" }, "string"] },
              { $function: {
                body: (item) => JSON.parse(item),
                args: ["$$this"],
                lang: "js"
              }},
              "$$this"
            ]
          }
        }
      }
    }
  }]
)
可选优化(非必须)

如果前端不需要通过FormData传文件,可以直接传JSON格式请求体,不需要手动做JSON.stringify转字符串,能省去前后端的序列化/解析步骤,减少类型错误。


内容的提问来源于stack exchange,提问作者8SINS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:09:14