Axios: 请求参数没有与实例参数合并

创建于 2019-05-31  ·  83评论  ·  资料来源: axios/axios

描述错误

特定请求参数不会与实例默认参数合并。

再现

const instance = axios.create({
    baseURL: "http://www.example.com",
    params: {
      q: "question",
    }
  });
instance.get("/page", 
  { 
    params: { 
      page: 2 
    }
  }
)

发生的情况是请求参数对象覆盖了实例默认参数对象。 该实例不再具有q的查询参数。

预期行为

根据文档,所有配置选项都已合并https://github.com/axios/axios#instance -methods

我希望请求同时包含qpage参数。 这也是它在 0.18.0 版本中的工作方式,这就是我注意到的方式。

环境:

  • Axios 版本:0.19.0
  • 操作系统:10.14.5 (18F132)
  • 浏览器:Node Express 和 Chrome
  • 浏览器:Node 10.15.0,Chrome 版本 74.0.3729.169(官方版本)(64 位)
review

最有用的评论

坐等官方解决😭

所有83条评论

我们基于会话的身份验证令牌也没有被合并,也有类似的问题。

我_相信_修复就像将params到属性到deepMergeProperties部分一样简单。 这里的差异: https :

@zackseuberling你能

我有同样的问题。

@jasonsaayman测试现在在 #2196 中通过(因为我认为正确的行为是)

希望尽快发布,这个问题让我很烦

有同样的问题。 什么时候能修好?

同样在这里@wphestiraid 😬

降级到0.18.1为我修复了它作为一种解决方法! 这已经修复了安全漏洞。

@serranoarevalo我认为我们可以使用0.18.1 :smile:

这似乎也发生在method ,如果它只在create调用中指定而不是在request 。 我花了一整天才弄明白,这绝对是一个突破性的变化。 (这应该是一个单独的问题,还是属于同一一般问题的一部分?)

同样的问题在这里

有关于这个的任何消息吗? 什么时候修复?

有关于这个的任何消息吗? 什么时候修复?

暂时只使用v0.18.1 。 ✈️

这就是我正在使用的,但由于安全问题,一旦修复,我需要升级到v0.19.0

这就是我正在使用的,但由于安全问题,一旦修复,我需要升级到v0.19.0

什么样的安全问题? v0.18.0有安全问题, v0.18.1

NPM 在审计期间仍然将 0.18.1 标记为易受攻击的——可能是一个红鲱鱼。

如果您需要像我一样使用 axios 0.19 ,您可以像这样管理参数,作为一种解决方法,它现在应该可以正常工作。

// Pass to create only these params
const instance = axios.create({
  headers,
  baseURL,
  timeout,
});

// Pass others to the instance request
instance.request({
  method,
  url,
  data,
  ...options,
});

坐等官方解决😭

点赞。 刚刚花了一个下午的时间来追查这个错误,然后来到这里写一个问题。

提供修复有什么进展吗?

https://github.com/axios/axios/blob/v0.19.0/lib/core/mergeConfig.js#L18 -L22

module.exports = function mergeConfig(config1, config2) {
  // eslint-disable-next-line no-param-reassign
  config2 = config2 || {};
  var config = {};

  utils.forEach(['url', 'method', 'params', 'data'], function valueFromConfig2(prop) {
    if (typeof config2[prop] !== 'undefined') {
      config[prop] = config2[prop];
    }
  });

v0.19.0 代码显示mergeConfig(axios_instance.defaults, config)
只有请求 config.params 被使用。

为什么次要版本与以前的版本不兼容?
没有这方面的测试?
我得问。

@magicdawn我认为他们搞砸了。 我不明白他们正在等待合并修复程序。 请@emilyemorehouse ,帮助我们https://github.com/axios/axios/pull/2196 🙏!

任何新闻? 我遇到了同样的错误,然后升级到最新版本。

问题是这会得到修复!!

我花了一段时间才发现这个问题...烦人。 也在等修复。

可能是一个 hack,但您也可以为创建的 axios 实例修补 get 方法:

const client = axios.create({
  baseURL: YOUR_URL,
})
client.originalGet = client.get
client.get = (url, { params, ...config }) =>
  client.originalGet(url, {
    ...config,
    params: {
      key: YOUR_API_KEY,
      ...params,
    },
  })


// use it like normal
client.get('/something', { params: paramsToMerge } )

我包装了 create 实例并修补了所有方法,如下所示:

export const createInstance = (config?: AxiosRequestConfig): AxiosInstance => {
  const instance = axios.create(config);

  // Patch methods to merge default params into each request.
  // https://github.com/axios/axios/issues/2190
  for (const [method, configIndex] of methodsToPatch as Array<[keyof AxiosInstance, number]>) {
    const orig = instance[method] as Function;
    // @ts-ignore
    instance[method] = (...args: any[]) => {
      if (!args[configIndex]) {
        args[configIndex] = {};
      }
      args[configIndex].params = {
        ...(instance.defaults.params || {}),
        ...(args[configIndex].params || {}),
      };
      return orig.apply(instance, args);
    };
  }

  return instance;
};

const methodsToPatch = [
  ['getUri', 0],
  ['request', 0],
  ['get', 1],
  ['delete', 1],
  ['head', 1],
  ['post', 2],
  ['put', 2],
  ['patch', 2],
];

对于寻找解决方法的每个人,您可以使用我的(可能不适用于所有人):

npm i qs

axios.interceptors.request.use(config => {
    config.paramsSerializer = params => qs.stringify({ ...params, myValue: 'foo' });
    return config;
}

@janpantel我很好奇,为什么不直接修改参数?

axios.interceptors.request.use(config => {
    config.params.myValue = 'foo';
    return config;
}

@janpantel谢谢我认为它是这样工作的,也比其他替代品更干净

我们有一个非常相似的错误。

事实上,我们甚至不能用axios.create()指定任何实例params axios.create()
与此同时,我们又回到了一个请求拦截器......

我也是。 今天把我逼疯了! 一切正常。 然后突然我遇到了身份验证问题和 CORS 问题?! 哎呀...

我发现我已经从 v18 更新到 v19,然后我猜继承了这个错误。 当我稍后使用新参数调用该实例时,我在实例定义中定义的“默认”参数(旧式 authkey 参数)似乎没有合并,新参数杀死了默认值 :(。

降级到18版解决了。 希望他们尽快修复它,我喜欢我所有的模块都是最新的! :P

我现在转而在节点和浏览器中使用 umi-request。
到目前为止,一切都很好。 😄

自2020年以来,同样的问题仍然存在。
它是否按设计运行或何时可以解决此问题?

Axios 版本:0.19.0

感谢您提供如此有用的库!

v0.19.1还有这个bug 😞

已经解决了这个问题。 这真的很烦人。 我花了 15 分钟才弄清楚这个错误。

同样的问题在这里使用[email protected] 。 使用拦截器作为解决方法。

[email protected]仍然有同样的问题

npm install --save [email protected]

也有这个问题。 请修复

某种无休止的戏剧

甚至实例参数不会与调用参数合并。 实例参数根本不会进入请求的参数。 如果我创建一个实例并定义参数,它们将永远不会出现在我的一个 get 请求中。

与在每次 get 调用时定义参数相比,降级是更容易的选择。

为什么这个问题被关闭了? 正如@renestalder 所提到的,在上一个版本中,没有任何实例参数出现在任何使create方法变得毫无意义的请求中。

它已关闭,因为它已在 #2656 中修复,但仍然没有版本。

我也使用拦截器作为一种解决方法,比如@cheelahim建议:

axios.interceptors.request.use(config => {
  config.params. = {
    myValue1: 'foo',
    myValue2: 'bar',
    ...config.params,        
  }
    return config;
}

但仍在等待新版本修复此错误。

Axios 获取和参数

      const params = {
        name,
        id,
        pageIndex,
        pageSize,
      };
      const url = `/api/poi/query`;
      axios
      // .get(url, params)
      .get(url, {
        params,
      })
    .then(json => {
        // do something
      })
     .catch(err => console.log(`error`, err));

https://stackoverflow.com/questions/40947650/axios-get-in-url-works-but-with-second-parameter-as-object-it-doesnt

哇! 将近1年后!

漏洞依然存在! 不敢相信……

该修复程序已在 #2656 中合并,但尚未删除其版本

只需降级到 0.18.0

为什么关门了?

不幸的是,只要您需要进度事件或取消支持, fetch就会出局。

只需将您的版本固定到^0.18.1

@techouse转向替代品是更好的解决方案。

我一直喜欢使用 axios。 但是这个修复已经存在了这么长时间并且没有人能够设法将它分配给一个版本的想法只是一个笑话,是时候继续前进了。 或者让某人来管理这个真正想要改进产品的人。

乔恩·阿尔伯格尼
技术总监
[email protected]
哦。 802-323-4558 | C。 802-323-4558 | www.legacyresearch.com http://www.legacyresearch.com


来自:Evgeny [email protected]
发送时间:2020 年 4 月 23 日星期四 10:59:32
至:axios/axios [email protected]
抄送:Jon Alberghini [email protected] ; 评论[email protected]
主题:回复:[axios/axios] 请求参数未与实例参数合并 (#2190)

@techouse https://github.com/techouse转向替代方案是更好的解决方案。


您收到此消息是因为您发表了评论。
直接回复本邮件,在 GitHub 上查看https://github.com/axios/axios/issues/2190#issuecomment-618445756 ,或者退订https://github.com/notifications/unsubscribe-auth/AF6OZWIPRREAQP5OGY437X3ROBJVJANCNFSM4HRPA6A

我认为它已关闭,因为已合并修复程序并且应该在 v0.20.0 中发布。 看这里

同样的问题,希望早日解决!

+1。 暂时降级。 嗯。

@khastation @raphaelbadawi @jonathanalberghini @techouse @AndyOGo

备择方案:

@马努奇克
不幸的是,只要您需要进度事件或取消支持, fetch就会出局。

@AndyOGo可以像https://javascript.info/fetch-progress一样实现

我找到了使用一些解构来分离关键参数的方法。 临时代码是肯定的,但由于合并已经完成并且 0.20.0 正在进行中,我真的很有信心。 Axios 仍然是我要走的路,即使我对 fetch() 有经验。 Axios 的东西通常都很精简 ;-)

谢谢@mahnunchik
虽然我说的是下载和上传的进度事件

谢谢你的问题@bdrtsky
主要有以下几个原因:

  • fetch指定了几个与XMLHttpRequest相比的回归
  • 一旦您构建了大规模服务,取消就变得很重要
  • 我构建了一个文件上传器,所以我需要更复杂的进度处理

由于已将修复程序分配给 0.20 版本,因此已关闭。 我们目前正在开发该版本,0.20 的重点是修复回归并再次发布稳定的 Axios。

这是正在进行的工作,更新检查 0.20 项目。

是否可以将其放入 0.19.3 补丁版本中? 如果在同一个次要版本中没有修复缺陷,则无法关闭它...

我已经重新打开,但我们不会发布 0.19.3。 我们希望在 0.20 版本中获得稳定性,以消除从 0.18.0 到 0.19.2 的所有回归。

似乎唯一可能的解决方案是降级。

我们什么时候可以期待这个难以捉摸的 0.20 版本? 我们可以同时使用测试版吗?

@adamreisnz我正在处理 0.20 版本,但仍然有大约 60 个奇怪的拉取请求(从 120 个奇数减少),其中一些非常古老并且在检查和确保这些拉取请求仍然相关方面的工作量不一,不要提出重大更改,进行测试,不要包含编译文件等,这是一项劳动。 我努力尝试在 7 月之前将其预发布。 我们很乐意帮助测试这个版本,因为我们真的很想在我们开发 v1 之前把它做好。

很烦人的问题,希望能修复,长期维护。

想在我们处理 v1 之前把它做好

0.x有足够的空间在1.0.0之前发布额外的版本; 你不必把所有东西都塞进下一个版本。 事实上,有人可能会争辩说,这只会使潜在的新错误更难追踪。

@markcarver当然,我们可以但是 Axios 目前被视为预发布版本,因为没有 v1 对大多数人来说,Axios 尚未发布公共 API,请参阅SemVer PublicAPI 。 在 v0.20.0 中,我们希望带来稳定性并修复 0.19.x 分支中的大多数回归,因为该分支中存在一些问题,并解决容易获胜的错误。

我们也确实需要同时清除积压的拉取请求。 处理 120 个奇怪的拉取请求是非常困难的,其中一些请求可以追溯到 2017 年。我保证我们会解决这个问题,我不会去任何地方,并将尽我所能支持和工作 Axios。

谢谢

我认为只是积累了很多挫折,因为我们不能使用某些插件(例如 axios 缓存适配器),除非我们降级并锁定 v0.18 的 Axios,或者推出我们自己的(未维护的)版本并在那里应用修复.

这种情况已经持续了好几个月,我认为每个人都渴望看到至少发布一些修复程序。

是否无法移植一些当前应用的修复程序并发布 0.19.x 以便至少我们可以使用最新的代码库? 如果您打算再处理 120 个拉取请求,恐怕我们要等很长时间才能看到 0.20 或 v1.2 版本。

如果可能的话,我个人会选择更渐进的方法。

@adamreisnz确定我也会选择增量,但是从 0.18.x 到 0.19.x 有很多问题,我的想法是尝试使 0.20.0 版本稳定,并包含该版本中一些最紧迫的内容。 我们只剩下 60 个拉取请求,我已经完成了其余的请求,其中 60 个被标记为wipv1

我知道这已经很长时间了,但这次我想把它做好,而不仅仅是在这一点上释放和破坏更多的事情,这在很大程度上是可能的。 此外,该版本在公开之前还需要进行广泛的测试。 我感到沮丧,但如果我们不能让它稳定并修复大量回归,我们可以发布任意数量的增量,并且仍然坐拥超过 200~ 问题和 60~ 拉请求,这些请求只是坐在那里变得陈旧,以及一个仍然非常坏的 Axios,甚至可能更坏。

此外,我目前不控制发布,当我开始帮助时,我承诺将构建一个可以修复回归和最紧迫问题的构建,并且不会破坏以前工作的任何其他东西。 我对此非常认真,并愿意这样做。

但是,我可以尝试获得 0.18.x 版本,并修复任何安全问题等,如果这有帮助的话?

但是,我可以尝试获得 0.18.x 版本,并修复任何安全问题等,如果这有帮助的话?

那将是真棒。

PS:我们都感谢您通过维护一个对许多 Web 项目来说错综复杂的包所做的辛勤工作。 😊

但是,我可以尝试获得 0.18.x 版本,并修复任何安全问题等,如果这有帮助的话?

是的,我同意,这肯定会受到赞赏。

如果您需要任何帮助来测试一些新东西,请告诉我我愿意这样做。

@adamreisnz你能测试这个分支

我可以,是的,本周末将尝试为我们的一个项目切换到该分支。

@jasonsaayman到目前为止很好,0.20.0 似乎运行良好👍

看来,问题现在可以关闭了

在收到反馈后关闭,这现在在新版本下正常工作。

此页面是否有帮助?
0 / 5 - 0 等级