Axios: Les paramètres de requête ne sont pas fusionnés avec les paramètres d'instance

Créé le 31 mai 2019  ·  83Commentaires  ·  Source: axios/axios

Décrivez le bogue

Les paramètres de requête spécifiques ne sont pas fusionnés avec les paramètres par défaut de l'instance.

Reproduire

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

Ce qui se passe, c'est que l'objet param de la demande remplace l'objet param par défaut de l'instance. L'instance n'a plus de paramètre de requête de q .

Comportement prévisible

D'après la doc, toutes les options de configuration sont fusionnées . https://github.com/axios/axios#instance -methods

Je m'attendais à ce que la demande contienne à la fois les paramètres q et page . C'est aussi comme ça que ça fonctionnait dans la version 0.18.0, c'est ce que j'ai remarqué.

Environnement:

  • Version Axio : 0.19.0
  • Système d'exploitation : 10.14.5 (18F132)
  • Navigateur : Node Express et Chrome
  • Navigateur : Node 10.15.0, Chrome Version 74.0.3729.169 (version officielle) (64 bits)
review

Commentaire le plus utile

En attente d'un correctif officiel

Tous les 83 commentaires

Avoir un problème similaire avec nos jetons d'authentification basés sur la session qui ne sont pas fusionnés non plus.

Je crois que le correctif est aussi simple que de déplacer params vers la propriété vers la section deepMergeProperties . Diff ici: https://github.com/axios/axios/compare/8d0b92b2678d96770304dd767cd05a59d37f12cf...zackseuberling:zs-fix-merge-params

@zackseuberling pourriez-vous faire une pull request pour cela ?

J'ai le même problème.

Les tests

j'espère sortir bientôt, le problème m'a rendu assez ennuyeux

Avoir le même problème. Quand est-ce que ça va être réparé ?

Même ici @wphestiraid 😬

La rétrogradation à 0.18.1 corrigé pour moi comme solution de contournement ! Cela a la vulnérabilité de sécurité corrigée.

@serranoarevalo Je pense que nous pouvons utiliser 0.18.1 :smile:

Cela semble également se produire avec method , s'il n'est spécifié que dans l'appel create et non dans le request . Il m'a fallu toute la journée pour comprendre cela, un changement décisif. (Est-ce qu'il s'agit d'un problème distinct ou fait-il partie du même problème général ?)

Même problème ici

des nouvelles de celui-ci ? quand sera-t-il réparé ?

des nouvelles de celui-ci ? quand sera-t-il réparé ?

Utilisez simplement v0.18.1 pour le moment. ✈️

c'est ce que j'utilise, mais je dois passer à v0.19.0 une fois que cela est résolu en raison de problèmes de sécurité

c'est ce que j'utilise, mais je dois passer à v0.19.0 une fois que cela est résolu en raison de problèmes de sécurité

Quel genre de problèmes de sécurité ? v0.18.0 eu des problèmes de sécurité, v0.18.1 est correct.

NPM signale toujours 0.18.1 comme vulnérable lors d'un audit - probablement un faux-fuyant.

Si vous devez utiliser axios 0.19 comme moi, vous pouvez gérer les paramètres comme celui-ci et cela devrait fonctionner correctement pour le moment comme solution de contournement .

// 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,
});

En attente d'un correctif officiel

vote positif. Je viens de passer l'après-midi à traquer ce bug et je suis venu ici pour écrire un numéro.

Y a-t-il des progrès pour fournir un correctif?

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];
    }
  });

le code v0.19.0 montre que mergeConfig(axios_instance.defaults, config)
seule la requête config.params est utilisée.

Pourquoi une version mineure non compatible avec la version précédente ?
Pas de test pour ça ?
Je dois demander.

@magicdawn Je pense qu'ils ont foiré. Je ne comprends pas ce qu'ils attendent pour fusionner le correctif. Pls @emilyemorehouse , aidez-nous avec https://github.com/axios/axios/pull/2196 🙏 !

Des nouvelles? J'ai eu la même erreur puis mise à niveau vers la dernière version.

Quel est le problème est-ce que cela va jamais être corrigé !!

J'ai mis du temps à trouver ce problème... ennuyeux. En attente d'un correctif aussi.

C'est peut-être un hack, mais vous pouvez également patcher la méthode get pour une instance axios créée :

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 } )

J'ai encapsulé l'instance de création et corrigé toutes les méthodes comme ceci :

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],
];

Pour tous ceux qui recherchent une solution de contournement, vous pouvez utiliser le mien (peut ne pas s'appliquer à tous):

npm i qs

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

@janpantel je suis curieux, pourquoi ne pas simplement modifier les paramètres ?

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

@janpantel merci, je pense que cela fonctionne de cette façon, c'est aussi plus propre que les autres alternatives

Nous avons une erreur très similaire.

En fait, nous ne pouvons même pas spécifier d'instance params avec axios.create() .
Pendant ce temps, nous nous sommes rabattus sur un intercepteur de requêtes...

Pareil pour moi. M'a rendu fou aujourd'hui ! Tout fonctionnait bien. Puis soudain, j'ai eu des problèmes d'authentification et des problèmes CORS ? ! Yargh...

J'ai découvert que j'avais mis à jour de la v18 à la v19 et que j'avais ensuite hérité de ce bogue, je suppose. Il semble que les paramètres "par défaut" que j'ai définis dans la définition de l'instance (un paramètre de clé d'authentification à l'ancienne) n'étaient pas fusionnés lorsque j'ai appelé cette instance plus tard avec de nouveaux paramètres, les nouveaux paramètres ont supprimé les paramètres par défaut :(.

Le rétrogradé à la version 18 l'a résolu. J'espère qu'ils le résoudront bientôt, j'aime tous mes modules à jour ! :P

Je me tourne maintenant vers umi-request dans le nœud et le navigateur.
Jusqu'ici, tout va bien. ??

Le même problème existe toujours depuis 2020.
Fonctionne-t-il comme prévu ou quand ce problème peut-il être résolu ?

Version Axio : 0.19.0

Merci d'avoir fourni une bibliothèque si utile !

v0.19.1 toujours ce bug 😞

Corrigez déjà cela. c'est vraiment embêtant. m'a pris 15 minutes pour comprendre ce bug.

Même problème ici en utilisant [email protected] . Utiliser des intercepteurs comme solution de contournement.

Toujours le même problème avec [email protected]. Rétrogradez les axios pour le faire fonctionner.

npm install --save [email protected]

Avoir ce problème aussi. S'il-vous-plaît, réparez

une sorte de drame sans fin

Ce n'est même pas que les paramètres d'instance ne seraient pas fusionnés avec les paramètres d'appel. Les paramètres d'instance n'entrent pas du tout dans les paramètres de la demande. Si je crée une instance et que je définis des paramètres, ils ne seront jamais trouvés dans l'une de mes requêtes get.

La rétrogradation était l'option la plus simple que de définir les paramètres à chaque appel get.

Pourquoi ce problème est-il clos ? Comme @renestalder l'a mentionné, dans la dernière version, aucun des paramètres d'instance n'apparaît dans aucune requête, ce qui rend la méthode create quelque peu inutile.

Il est fermé car il est corrigé dans #2656, mais il n'y a toujours pas de version pour cela.

J'ai également utilisé l'intercepteur comme solution de contournement, quelque chose comme @cheelahim a suggéré :

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

Mais j'attends toujours une nouvelle version pour corriger ce bug.

Axios get & paramètres

      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

woah ! presque 1 an plus tard !

Le bug existe toujours ! Je ne peux pas croire......

Le correctif a été fusionné dans #2656 mais une version pour cela n'a pas encore été coupée

Il suffit de rétrograder à 0,18.0

Pourquoi est-il fermé ?

Malheureusement, fetch est disponible dès que vous avez besoin d'événements de progression ou d'une assistance en cas d'annulation.

Épinglez simplement votre version sur ^0.18.1 .

@techouse passer à des alternatives est une meilleure solution.

J'ai toujours aimé utiliser axios. Mais l'idée que ce correctif existe depuis si longtemps et que personne ne puisse l'attribuer à une version n'est qu'une blague, il est temps de passer à autre chose. Ou demandez à quelqu'un de gérer cela qui veut réellement faire progresser le produit.

Jon Alberghini
Directeur de la technologie
[email protected]
o. 802-323-4558 | c. 802-323-4558 | www.legacyresearch.com http://www.legacyresearch.com


De : Evgeny [email protected]
Envoyé : jeudi 23 avril 2020 10:59:32
À : axios/axios [email protected]
Cc : Jon Alberghini [email protected] ; Commentaire [email protected]
Objet : Re : [axios/axios] Les paramètres de requête ne sont pas fusionnés avec les paramètres d'instance (#2190)

@techouse https://github.com/techouse passer à des alternatives est une meilleure solution.

-
Vous recevez ceci parce que vous avez commenté.
Répondez directement à cet e-mail, consultez-le sur GitHub https://github.com/axios/axios/issues/2190#issuecomment-618445756 , ou désabonnez-vous https://github.com/notifications/unsubscribe-auth/AF6OZWIPRREAQP5OGY437X3ROBJVJANCNFSM4HRPA6AQ .

Je pense qu'il est fermé car un correctif a été fusionné et est censé être publié dans la v0.20.0 . Voir ici

Même problème ici, en espérant qu'il sera bientôt résolu !

+1. déclassement pour le moment. smh.

@khastation @raphaelbadawi @jonathanalberghini @techouse @AndyOGo

Alternatives :

@mahnunchik
Malheureusement, fetch est disponible dès que vous avez besoin d'événements de progression ou d'une assistance en cas d' annulation .

@AndyOGo Il peut être implémenté comme https://javascript.info/fetch-progress

J'ai trouvé mon chemin en utilisant un peu de déconstruction pour séparer le paramètre de clé. Du code temporaire bien sûr, mais comme la fusion est déjà faite et que la 0.20.0 est en cours, je suis vraiment confiant. Axios est toujours ma voie à suivre, même si je suis expérimenté avec fetch(). Les choses sont généralement si maigres avec Axios ;-)

Merci @mahnunchik
Bien que je parle des événements de progression à télécharger et à télécharger !

Merci pour votre question @bdrtsky
Principalement pour ces raisons :

  • fetch spécifie plusieurs régressions par rapport à XMLHttpRequest
  • l'annulation devient importante dès que vous construisez des services à grande échelle
  • J'ai construit un téléchargeur de fichiers, j'ai donc besoin d' une gestion de la

Ceci est fermé en raison du correctif déjà affecté à la version 0.20. Nous travaillons actuellement sur cette version, le but de la 0.20 est de corriger les régressions et de publier à nouveau un Axios stable.

C'est un travail en cours, pour les mises à jour, vérifiez le projet 0.20.

Est-il possible de le mettre en version patch 0.19.3 ? Le défaut ne peut pas être fermé s'il n'est pas corrigé dans la même version mineure...

J'ai rouvert mais nous ne publierons pas de 0.19.3. Nous aimerions gagner en stabilité dans une version 0.20 qui supprime toute régression de 0.18.0 à 0.19.2.

Il semble que la seule solution possible rn soit de rétrograder.

Quand pouvons-nous nous attendre à cette version 0.20 insaisissable ? Existe-t-il une version bêta que nous pouvons utiliser en attendant ?

@adamreisnz Je travaille sur la version 0.20 mais il y a encore environ 60 demandes d'extraction impaires (en baisse de 120 impairs), certaines étant très anciennes et variées pour vérifier et s'assurer que ces demandes d'extraction sont toujours pertinentes, ne présentez pas de changement de rupture, faites des tests, n'incluez pas de fichiers compilés, etc., c'est un travail. Je m'efforce d'essayer d'en faire une pré-version d'ici juillet au mieux. Nous serions ravis de vous aider à tester cette version car nous voulons vraiment bien faire les choses avant de travailler sur une v1.

C'est un problème ennuyeux, j'espère qu'il peut être résolu, est maintenu pendant longtemps.

voulez bien faire les choses avant de travailler sur une v1

Il y a beaucoup de place dans 0.x pour faire des versions supplémentaires avant 1.0.0 ; vous n'avez pas à tout mettre dans la prochaine version. En fait, on pourrait affirmer que cela ne ferait que rendre les nouveaux bogues potentiels plus difficiles à traquer.

@markcarver Bien sûr, nous pourrions cependant Axios est actuellement considéré comme une pré-version car sans v1, il semble à la plupart des gens qu'Axios n'a pas publié d'API publique voir SemVer PublicAPI . Avec la v0.20.0, nous aimerions apporter de la stabilité et corriger la plupart des régressions de la branche 0.19.x car certains problèmes présentés dans cette branche ainsi que travailler sur les erreurs qui sont des gains faciles.

Nous devons également éliminer l'arriéré des demandes d'extraction en même temps. Il est très difficile de gérer 120 pull request dont certains venaient d'aussi loin que 2017. Je promets que nous arriverons à ce problème, je ne vais nulle part et je soutiendrai et travaillerai sur Axios autant que possible.

Merci

Je pense qu'il y a juste beaucoup de frustration qui s'accumule, car nous ne pouvons pas utiliser certains plugins (par exemple l'adaptateur de cache axios) à moins de rétrograder et de verrouiller Axios à la v0.18, ou de lancer notre propre version (non maintenue) et d'y appliquer le correctif .

C'est le cas depuis quelques mois maintenant, et je pense que tout le monde est impatient de voir au moins quelques correctifs publiés.

N'est-il pas possible de porter certains des correctifs actuellement appliqués et de publier une version 0.19.x afin que nous puissions au moins utiliser la dernière base de code ? Si vous avez l'intention de traiter encore 120 demandes d'extraction, je crains que nous attendions longtemps avant de voir un 0.20 ou une v1.

Personnellement, j'opterais pour une approche plus progressive, si possible.

@adamreisnz, bien sûr, j'opterais aussi pour des incréments, mais il y avait beaucoup de ruptures de 0.18.x à 0.19.x et l'idée était d'essayer de rendre une version 0.20.0 stable avec certains des éléments les plus urgents de cette version. Il ne nous reste plus que 60 demandes d'extraction, j'ai déjà travaillé sur le reste et certaines de ces 60 sont étiquetées comme wip ou v1 .

Je sais que cela fait longtemps, mais j'aimerais bien faire les choses cette fois-ci et pas seulement publier et casser plus de choses car à ce stade, c'est largement possible. De plus, la version nécessitera des tests à grande échelle avant de devenir publique. Je reçois la frustration, mais si nous ne le stabilisons pas et ne réparons pas une tonne de régressions, nous pourrions publier n'importe quel nombre d'incréments, et rester assis avec plus de 200 ~ problèmes et 60 ~ demandes d'extraction qui restent là et deviennent obsolètes, ainsi que un Axios encore très cassé, peut-être encore plus cassé.

De plus, je ne contrôle pas les versions pour le moment et quand j'ai commencé à aider, j'ai promis de créer une version qui corrigerait les régressions et les problèmes les plus urgents ainsi que de ne rien casser d'autre qui fonctionnait auparavant. Je prends cela assez au sérieux et j'aimerais le faire.

Je peux cependant essayer d'obtenir une version 0.18.x avec tous les problèmes de sécurité, etc. corrigés si cela peut aider ?

Je peux cependant essayer d'obtenir une version 0.18.x avec tous les problèmes de sécurité, etc. corrigés si cela peut aider ?

Ce serait génial.

PS : Nous apprécions tous le travail acharné que vous faites en maintenant un package qui est complexe pour tant de projets Web. ??

Je peux cependant essayer d'obtenir une version 0.18.x avec tous les problèmes de sécurité, etc. corrigés si cela peut aider ?

Oui, je suis d'accord, ce serait certainement apprécié.

Si vous avez besoin d'aide pour tester certaines des nouveautés, faites-moi savoir que je serais prêt à le faire.

@adamreisnz pourriez-vous tester cette branche : 0.20.0-beta.1

Je peux oui, j'essaierai de passer à cette branche ce week-end pour l'un de nos projets.

@jasonsaayman jusqu'ici tout va bien, 0.20.0 semble bien fonctionner 👍

Il semble que le problème puisse être clos maintenant

Fermeture après avoir reçu des commentaires indiquant que cela fonctionne maintenant comme il se doit dans la nouvelle version.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

altruisticsoftware picture altruisticsoftware  ·  3Commentaires

achingbrain picture achingbrain  ·  3Commentaires

ghprod picture ghprod  ·  3Commentaires

emaincourt picture emaincourt  ·  3Commentaires

ildella picture ildella  ·  3Commentaires