添加数组后,Postman发送JSON至Node.js服务出现语法错误求助
问题分析与解决方案
首先明确:这个错误的直接原因是Postman发送的JSON格式严重错误,导致Node.js的body-parser无法正常解析。不过你的Node.js代码也存在一些逻辑问题,咱们一步步来修复:
1. 先修复Postman的JSON请求体
你现在把info和review都错误地写成了字符串(用双引号包裹了整个对象),而且内部的JSON还有语法错误(缺少逗号、引号不匹配)。正确的JSON应该是嵌套对象,不需要把整个对象用引号包起来,同时键名要和你的Schema定义完全对应。
正确的请求JSON应该是这样的:
{ "info": { "title": "test title", "bad_point": 0, "Tag": "tag1" }, "review": { "Review_text": ["1번리뷰", "2번리뷰", "3번리뷰"], "Phone_list": ["010-0000-0000", "010-1111-1111", "010-2222-2222"], "LatLng_list": ["111.1111,111.1111", "222.222,222.222","333.3333,333.3333"] } }
核心修正点:
- 去掉
info和review外层的双引号,让它们成为JSON对象而非字符串 - 把
badPoint改成Schema里定义的bad_point,并且用数字0而非字符串"0"(因为你的Schema里bad_point是Number类型) - 补上
bad_point后面缺失的逗号 - 修正
Phone_list的引号冲突问题(你原来的写法会导致JSON解析器识别错误)
2. 修复Node.js代码中的问题
2.1 Schema的create方法变量未解构
你的Item.statics.create方法里直接使用了title, bad_point, Tag,但这些变量并没有从传入的info参数里解构出来,会导致ReferenceError。修改成这样:
Item.statics.create = function(info, review){ // 从info参数里解构出需要的字段 const { title, bad_point, Tag } = info; const list = new this({ info:{ title, bad_point, Tag }, review:{ Review_text: review.Review_text, Phone_list: review.Phone_list, LatLng_list: review.LatLng_list } }); return list.save(); };
2.2 register函数的逻辑错误
你的register函数里调用了RouteReviewItem.findOneBytitle(title),但title变量并没有定义,而且如果是创建新数据,需要先检查该title是否已存在(如果有这个需求的话)。修改后的代码:
exports.register = (req, res) => { const { info, review } = req.body; // 先从info里解构出title const { title } = info; const create = () => { return Item.create(info, review); }; const respond = () => { res.json({ message: 'place route registered successfully' }); }; const onError = (error) => { res.status(409).json({ message: error.message }); }; // 如果需要检查title是否已存在,用Mongoose的findOne方法查询 RouteReviewItem.findOne({ "info.title": title }) .then((existingItem) => { if (existingItem) { throw new Error('This title already exists'); } return create(); }) .then(respond) .catch(onError); };
修正说明:
- 从
info里解构出title,用于后续的查重逻辑 - 替换了自定义的
findOneBytitle(如果不是你自己封装的方法,Mongoose默认没有这个方法),改用标准的findOne查询嵌套字段 - 增加了查重逻辑,如果已存在同名title则抛出错误,否则执行创建操作
3. 验证修复效果
- 把Postman的请求体替换成正确的JSON格式
- 重启你的Node.js服务
- 重新发送请求,应该就能正常创建数据了
内容的提问来源于stack exchange,提问作者Jshin
相关产品推荐
相关产品推荐

