React Native GET传数组到Node.js服务端被解析为字符串如何解决
问题原因
- 前端传参写法错误:GET请求的URL查询参数是纯文本格式,你直接把数组
_bids拼接到URL字符串里时,JS会自动调用数组的toString()方法做隐式类型转换,单个元素的数组[37]会被转成字符串"37",多元素数组会被转成逗号分隔的字符串(比如[37,38]转成"37,38"),这种格式后端默认不会解析为数组类型。 - 后端判断逻辑存在bug:你写的
req.query.bids !== []判断永远成立,因为JS中数组是引用类型,独立创建的空数组和任何其他值做非全等比较都不会相等,这个判断完全起不到空值校验的作用。 - 你提到的调用
bids.json()是完全错误的用法:req.query已经是框架解析完成的键值对对象,不是未解析的请求流/Buffer,不存在json()方法,调用会直接抛错。
你当前控制台输出bids是长度为2的字符串"37",就是因为前端拼接时数组被隐式转成了字符串,字符串"37"的字符长度正好是2,和输出结果完全匹配。
修复方案
前端调整
不要手动硬拼接数组到URL里,使用标准的同参数名重复传值的数组传参格式(格式为bids=37&bids=38),所有后端的query解析器默认都能识别这种格式为数组。
手动拼接参考代码:
// 单独处理数组参数拼接,记得做URL编码 const bidsQuery = _bids.map(item => `bids=${encodeURIComponent(item)}`).join('&'); const url = `${GLOBAL.BASE_URL}/api/fortrades/bid4post?post_trade_id=${encodeURIComponent(item.id)}&${bidsQuery}`; const _res = await helper.getAPIp(url, _result, _params, "GET");
如果你的helper.getAPIp方法支持传入params配置对象,直接把bids: _bids作为参数传入即可,常规请求封装会自动处理数组参数的序列化,不需要手动拼接。
后端调整
删掉无效的空数组判断,同时兼容单值字符串、逗号分隔字符串、标准数组三种传参格式,统一转成数字数组:
let bids = req.query.bids; if (!bids) { bids = []; } else if (typeof bids === 'string') { // 兼容单值、逗号分隔字符串两种情况 bids = bids.split(',').map(Number); } else if (Array.isArray(bids)) { // 已经解析为数组的情况,统一转数字类型 bids = bids.map(Number); } console.log("bids in bid4post : ", bids, Array.isArray(bids), bids.length);
内容的提问来源于stack exchange,提问作者user938363
相关产品推荐
相关产品推荐

