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
相关产品推荐
相关产品推荐

