javascript - 使用 axios.get 作为参数发送数组是未定义的
问题描述
我正在使用其他参数选项发出获取请求,因为我在过滤器上使用该请求,因此参数是用于返回的过滤器:
const res = await axios.get("http://localhots:3000/getsomedata", {
params: {
firstFilter: someObject,
secondFilter: [someOtherObject, someOtherObject]
}
});
console.log(req.query);
在另一端,当我看到以下内容时,请求顺利通过:
{
firstFilter: 'someObject',
'secondFilter[]': ['{someOtherObject}', '{someOtherObject}'],
}
如果我这样做req.query.firstFilter
效果很好,但req.query.secondFilter
不起作用,为了让我获取数据,我必须这样做req.query["secondFilter[]"]
,有没有办法避免这种情况并能够获取我的数据数组req.query.secondFilter
?
我现在的解决方法是:
const filter = {
firstFilter: req.query.firstFilter,
secondFilter: req.query["secondFilter[]"]
}
它当然有效,但我不喜欢它,我肯定错过了一些东西。
解决方案
一些解析查询字符串的工具期望将数据数组编码为array_name=1&array_name=2
.
如果您有一个或多个项目,这可能是一个问题,因为它可能是一个数组或可能是一个字符串。
为了避免这个问题,PHP 需要将数据数组编码为array_name[]=1&array_name[]=2
,并且如果您遗漏了最后一项,则将丢弃除最后一项之外的所有数据[]
(因此您总是会得到一个字符串)。
许多生成数据以通过 HTTP 提交的客户端库决定以与 PHP 兼容的方式这样做(主要是因为 PHP 曾经并且非常普遍)。
所以你需要:
- 更改后端以能够解析 PHP 样式
- 更改对 axios 的调用,使其不会生成 PHP 样式
后端
具体细节取决于您使用的后端,但看起来您可能正在使用 Express.js。
查看设置。
您可以通过将其设置为“扩展”来打开扩展(PHP 样式)查询解析(尽管这是默认设置)
const app = express()
app.set("query parser", "extended");
前端
axios文档说:
// `paramsSerializer` is an optional function in charge of serializing `params` // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/) paramsSerializer: function (params) { return Qs.stringify(params, {arrayFormat: 'brackets'}) },
所以你可以覆盖它
const res = await axios.get("http://localhots:3000/getsomedata", {
params: {
firstFilter: someObject,
secondFilter: [someOtherObject, someOtherObject]
},
paramsSerializer: (params) => Qs.stringify(params, {arrayFormat: 'repeat'})
});
我的示例需要qs 模块
推荐阅读
- node.js - 在 Dokku 中以生产模式部署 nodeJS 应用程序
- c# - 如何解决空数据库表上的乐观并发异常错误
- postgresql - 使用 Postgresql 全文搜索模糊匹配所有搜索词
- javascript - 如何使用 vue-router 检查用户是否进入上一页?
- javascript - 如何从 websocket 连接中读取标头
- linux - 带有备份和删除的符号链接
- katalon-studio - 有没有办法创建“验证元素文本不是”关键字?
- gcc - gcc 的 Conda 安装以链接错误结束,加载共享库 libmpfr.so.4 时出错
- swift - Xcode 11 无法识别核心数据实体
- java - 由于外键关系 java.lang.IllegalArgumentException 无法持久化对象:对象不是声明类的实例