Axios发送GET请求传递二维数组时Express端如何正确解析?
问题根因
你遇到的参数格式异常是因为axios默认序列化GET请求参数时,会将二维数组的内层元素直接转为JSON字符串后拼接在URL参数中,因此服务端拿到的外层是数组,每个元素都是内层数组的JSON字符串格式。
方案1:仅服务端做解析(改造成本最低)
直接对拿到的salaries数组每一项做JSON解析即可,建议加异常捕获避免非法参数报错:
// Node.js 服务端示例代码 let parsedSalaries = [] try { parsedSalaries = req.query.salaries.map(item => { const range = JSON.parse(item) // 如果需要数值类型可以直接转,不需要的话可以去掉map(Number) return range.map(Number) }) } catch (err) { // 此处可加参数非法的错误处理逻辑,比如返回参数错误响应 throw new Error('salaries参数格式错误') }
方案2:前后端配合从根源解决(更规范,后续维护成本低)
可以在前端axios请求时配置参数序列化规则,让二维数组按标准格式传递,服务端可以直接拿到正确格式的二维数组,不需要额外解析:
给axios配置paramsSerializer,使用qs库(axios已内置依赖,无需额外安装)序列化参数:
import qs from 'qs' axios.get('https://example.org/getJobs', { params: { salaries, /* 其他参数 */ }, // 配置序列化规则,二维数组会被正确序列化为可被服务端直接解析的格式 paramsSerializer: (params) => qs.stringify(params, { arrayFormat: 'indices' }) })
如果用的是Node.js的express/koa框架,服务端不需要做任何额外处理,req.query.salaries就会是原始的二维数组格式。
备选方案:整体序列化传递
如果参数结构更复杂,也可以直接把salaries整体转成JSON字符串传递:
// 前端代码 axios.get('https://example.org/getJobs', { params: { salaries: JSON.stringify(salaries), /* 其他参数 */ } }) // 服务端代码 const parsedSalaries = JSON.parse(req.query.salaries)
注意:如果salaries数组长度非常大,会导致URL过长触发浏览器/服务器的URL长度限制,这种场景建议改成POST请求传递参数。
内容的提问来源于stack exchange,提问作者NickW
相关产品推荐
相关产品推荐

