Axios: Os parâmetros de solicitação não estão sendo mesclados com os parâmetros de instância

Criado em 31 mai. 2019  ·  83Comentários  ·  Fonte: axios/axios

Descreva o bug

Os parâmetros de solicitação específicos não são mesclados com os parâmetros padrão da instância.

Reproduzir

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

O que acontece é que o objeto de parâmetro de solicitação substitui o objeto de parâmetro padrão da instância. A instância não tem mais um parâmetro de consulta de q .

Comportamento esperado

De acordo com a documentação, todas as opções de configuração são mescladas . https://github.com/axios/axios#instance -methods

Eu esperava que a solicitação contivesse q e page params. Também funcionava assim na versão 0.18.0, que foi como percebi.

Ambiente:

  • Versão Axios: 0.19.0
  • OS: 10.14.5 (18F132)
  • Navegador: Node Express e Chrome
  • Navegador: Nó 10.15.0, versão do Chrome 74.0.3729.169 (versão oficial) (64 bits)
review

Comentários muito úteis

Esperando por uma correção oficial 😭

Todos 83 comentários

Aqui está um exemplo de execução - https://runkit.com/philipbjorge/axios-regression

Tendo um problema semelhante com nossos tokens de autenticação baseados em sessão não sendo mesclados.

Eu _acredito_ que a correção é tão simples quanto mover params para a propriedade para a seção deepMergeProperties . Compare aqui: https://github.com/axios/axios/compare/8d0b92b2678d96770304dd767cd05a59d37f12cf...zackseuberling : zs-fix-merge-params

@zackseuberling você poderia fazer uma solicitação de pull para isso?

Eu tenho o mesmo problema.

Os testes de

espero que seja lançado em breve, o problema me deixou muito irritante

Tendo o mesmo problema. Quando vai ser consertado?

O mesmo aqui @wphestiraid 😬

O downgrade para 0.18.1 corrigiu para mim como uma solução alternativa! Isso tem a vulnerabilidade de segurança corrigida.

@serranoarevalo Acho que podemos usar 0.18.1 : smile:

Isso parece acontecer também com method , se for especificado apenas na chamada create e não em request . Levei o dia todo para descobrir isso, definitivamente uma mudança significativa. (Este deve ser um problema separado ou é parte do mesmo problema geral?)

Mesmo problema aqui

alguma notícia sobre este? quando vai ser consertado?

alguma notícia sobre este? quando vai ser consertado?

Apenas use v0.18.1 por enquanto. ✈️

é isso que estou usando, mas preciso atualizar para v0.19.0 assim que isso for corrigido devido a problemas de segurança

é isso que estou usando, mas preciso atualizar para v0.19.0 assim que isso for corrigido devido a problemas de segurança

Que tipo de problemas de segurança? v0.18.0 teve problemas de segurança, v0.18.1 está bem.

O NPM ainda está sinalizando 0.18.1 como vulnerável durante uma auditoria - provavelmente uma pista falsa.

Se você precisar usar axios 0.19 como eu, você pode gerenciar os parâmetros como este e deve funcionar bem por agora como uma solução alternativa .

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

Esperando por uma correção oficial 😭

voto positivo. acabei de passar a tarde perseguindo esse bug e vim aqui para escrever um problema.

Existe algum progresso para fornecer uma correção?

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

o código v0.19.0 mostra que mergeConfig(axios_instance.defaults, config)
apenas o pedido config.params é usado.

Por que uma versão secundária não é compatível com a versão anterior?
Nenhum teste para isso?
Eu tenho que perguntar.

@magicdawn eu acho que eles favor , https://github.com/axios/axios/pull/2196 🙏!

Qualquer notícia? Recebi o mesmo erro e atualizei para a versão mais recente.

Qual é o problema é que isso nunca vai ser consertado!

Levei um tempo para achar esse problema ... irritante. Esperando uma correção também.

Pode ser um hack, mas você também pode corrigir o método get para uma instância axios criada:

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

Eu envolvi a instância de criação e apliquei o patch a todos os métodos como este:

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

Para todos que procuram uma solução alternativa, você pode usar a minha (pode não se aplicar a todos):

npm i qs

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

@janpantel Estou curioso, por que não apenas modificar os parâmetros?

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

@janpantel obrigado acho que funciona assim, também é mais limpo do que as outras alternativas

Temos um erro muito semelhante.

Na verdade, não podemos nem especificar qualquer instância params com axios.create() .
Enquanto isso, recorremos a um interceptor de solicitações ...

O mesmo para mim. Me deixou maluco hoje! Tudo estava funcionando bem. Então, de repente, eu estava tendo problemas de autenticação e problemas de CORS ?! Yargh ...

Eu descobri que atualizei de v18 para v19 e, em seguida, herdei esse bug, eu acho. Parece que os parâmetros 'padrão' que defini na definição da instância (um parâmetro authkey da velha escola) não estavam sendo mesclados quando chamei essa instância mais tarde com novos parâmetros, os novos parâmetros eliminaram os padrões :(.

O downgrade para a versão 18 resolveu o problema. No entanto, espero que eles consertem isso em breve, eu gosto de todos os meus módulos atualizados! : P

Eu começo a usar umi-request no node & browser agora.
até agora tudo bem. 😄

O mesmo problema ainda existe desde 2020.
Funciona conforme projetado ou quando esse problema pode ser resolvido?

Versão Axios: 0.19.0

Obrigado por fornecer uma biblioteca tão útil!

v0.19.1 ainda tem esse bug 😞

Corrija isso já. isso é realmente irritante. Levei 15 minutos para descobrir esse bug.

O mesmo problema aqui usando [email protected] . Usando interceptores como uma solução alternativa.

Ainda tendo o mesmo problema com [email protected]. Faça downgrade dos axios para que funcionem.

npm install --save [email protected]

Tendo esse problema também. Por favor conserte

algum tipo de drama sem fim

Não é que os parâmetros da instância não seriam mesclados com os parâmetros da chamada. Os parâmetros da instância não vão para os parâmetros da solicitação. Se eu criar uma instância e definir parâmetros, eles nunca serão encontrados em uma de minhas solicitações get.

O downgrade era a opção mais fácil do que definir os parâmetros a cada chamada get.

Por que este problema foi encerrado? Como @renestalder mencionou, na última versão, nenhum dos parâmetros de instância aparece em qualquer solicitação, o que torna o método create um tanto sem sentido.

Está fechado porque está corrigido no # 2656, mas ainda não há uma versão para ele.

Usei o interceptor como uma solução alternativa também, algo como @cheelahim sugeriu:

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

Mas ainda estou esperando por uma nova versão para corrigir esse bug.

Axios get & params

      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

uau! quase 1 ano depois!

O bug ainda existe! Não posso acreditar ...

A correção foi mesclada no # 2656, mas uma versão para ela ainda não foi cortada

Basta fazer o downgrade para 0.18.0

Por que está fechado?

Infelizmente fetch será lançado assim que você precisar de eventos de progresso ou suporte para cancelamento.

Basta fixar sua versão em ^0.18.1 .

A mudança de

Sempre gostei de usar axios. Mas a ideia de que essa correção existe há tanto tempo e ninguém consegue atribuí-la a uma versão é apenas uma piada, é hora de seguir em frente. Ou peça a alguém para gerenciar isso que realmente queira fazer o produto progredir.

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


De: Evgeny [email protected]
Enviado: quinta-feira, 23 de abril de 2020 10:59:32
Para: axios / axios [email protected]
Cc: Jon Alberghini [email protected] ; Comentário [email protected]
Assunto: Re: [axios / axios] Os parâmetros de solicitação não estão sendo mesclados com os parâmetros de instância (# 2190)

@techouse https://github.com/techouse mudar para alternativas é a melhor solução.

-
Você está recebendo isso porque comentou.
Responda a este e-mail diretamente, veja-o no GitHub https://github.com/axios/axios/issues/2190#issuecomment-618445756 ou cancele a inscrição https://github.com/notifications/unsubscribe-auth/AF6OZWIPRREAQP5OGY437X3ROBJVJANCNFSM4HRPA6 .

Acho que está fechado porque uma correção foi mesclada e deve ser lançada na v0.20.0. Veja aqui

O mesmo problema aqui, espero que seja corrigido em breve!

+1. rebaixando por enquanto. smh.

@khastation @raphaelbadawi @jonathanalberghini @techouse @AndyOGo

Alternativas:

@mahnunchik
Infelizmente fetch será lançado assim que você precisar de eventos de progresso ou suporte para cancelamento .

@AndyOGo Pode ser implementado como https://javascript.info/fetch-progress

Eu encontrei minha saída usando alguma desconstrução para separar o parâmetro chave. Código temporário com certeza, mas como a fusão já foi feita e o 0.20.0 está em andamento, estou muito confiante. Axios ainda é meu caminho a percorrer, mesmo se eu tiver experiência com fetch (). As coisas geralmente são tão simples com o Axios ;-)

Obrigado @mahnunchik
Embora eu esteja falando sobre eventos de progresso para download e upload !

Obrigado pela sua pergunta @bdrtsky
Principalmente por estes motivos:

  • fetch especifica várias regressões em comparação com XMLHttpRequest
  • o cancelamento se torna importante assim que você cria serviços de grande escala
  • Eu construí um uploader de arquivos, então preciso de um tratamento de progresso mais sofisticado

Este foi encerrado devido à correção já ter sido atribuída à versão 0,20. No momento, estamos trabalhando nessa versão, o ponto de 0,20 é consertar as regressões e lançar um Axios estável novamente.

Este é um trabalho em andamento, para atualizações verifique o projeto de 0,20.

É possível colocá-lo na versão de patch 0.19.3? O defeito não pode ser fechado se não for corrigido na mesma versão secundária ...

Eu reabri, mas não lançaremos um 0.19.3. Gostaríamos de obter estabilidade em uma versão de 0,20 que remove toda a regressão de 0,18,0 a 0,19,2.

Parece que a única solução possível é fazer o downgrade.

Quando podemos esperar este lançamento de 0,20 indescritível? Existe uma versão beta que podemos usar nesse meio tempo?

@adamreisnz , estou trabalhando na versão 0,20, mas ainda há cerca de 60 solicitações de pull ímpares (baixou de 120), algumas sendo muito antigas e com uma quantidade variada de trabalho para verificar e garantir que essas solicitações de pull ainda sejam relevantes, não apresente uma alteração importante, faça testes, não inclua arquivos compilados etc. etc. é um trabalho. Eu me esforço para tentar colocá-lo em um pré-lançamento até julho, na melhor das hipóteses. Adoraríamos ajudar a testar esta versão, pois realmente queremos acertar antes de trabalhar em uma v1.

É um problema chato, espero que possa ser consertado, é mantido por muito tempo.

quero acertar antes de trabalharmos em uma v1

Há muito espaço em 0.x para fazer lançamentos adicionais antes de 1.0.0 ; você não precisa amontoar tudo na próxima versão. Na verdade, pode-se argumentar que isso apenas tornaria possíveis novos bugs mais difíceis de rastrear.

@markcarver Claro que poderíamos, no entanto, Axios é visto como um pré-lançamento atualmente, pois sem uma v1 parece para a maioria das pessoas que Axios não lançou uma API pública, consulte SemVer PublicAPI . Com a v0.20.0, gostaríamos de trazer estabilidade e corrigir a maioria das regressões do branch 0.19.x como alguns problemas apresentados neste branch, bem como trabalhar em erros que são vitórias fáceis.

Também precisamos limpar o acúmulo de solicitações pull ao mesmo tempo. É muito difícil lidar com 120 pull request ímpares, onde alguns deles estavam já em 2017. Eu prometo que chegaremos a esse problema, não vou a lugar nenhum e irei apoiar e trabalhar no Axios tanto quanto puder.

Obrigado

Acho que há muita frustração se acumulando, porque não podemos usar certos plug-ins (por exemplo, adaptador de cache axios) a menos que façamos o downgrade e travemos o Axios na v0.18, ou desenvolvamos nossa própria versão (sem manutenção) e apliquemos a correção lá .

Esse tem sido o caso há alguns meses, e acho que todos estão ansiosos para ver pelo menos algumas correções lançadas.

Não é possível portar algumas das correções aplicadas atualmente e lançar um 0.19.x para que pelo menos possamos usar a base de código mais recente? Se você pretende passar por mais 120 solicitações de pull, infelizmente vamos esperar muito tempo até que vejamos 0,20 ou v1.

Eu pessoalmente optaria por uma abordagem mais incremental, se possível.

@adamreisnz tenho certeza que optaria por incrementos também, mas houve muitas rompimentos de 0.18.x para 0.19.xe a ideia era tentar fazer uma versão de 0.20.0 estável com algumas das coisas mais urgentes dessa versão. Temos apenas 60 solicitações de pull restantes, já trabalhei com o resto e algumas dessas 60 estão marcadas como wip ou v1 .

Eu sei que já faz muito tempo, mas eu gostaria de acertar desta vez e não apenas liberar e quebrar mais coisas porque neste momento isso é amplamente possível. Além disso, a construção precisará de testes amplamente difundidos antes de se tornar pública. Eu fico com a frustração, mas se não ficarmos estáveis ​​e corrigirmos uma tonelada de regressões, poderíamos liberar qualquer número de incrementos e ainda ficar com mais de 200 ~ problemas e 60 ~ solicitações de pull que ficam paradas e obsoletas, bem como um Axios ainda muito quebrado, talvez ainda mais quebrado.

Além disso, eu não controlo os lançamentos no momento e quando comecei a ajudar, prometi fazer um build que corrigisse as regressões e os problemas mais urgentes, além de não quebrar nada do que funcionava anteriormente. Levo isso muito a sério e gostaria de fazer isso.

Posso, no entanto, tentar obter uma versão 0.18.x com quaisquer problemas de segurança, etc corrigidos, se isso for algo que possa ajudar?

Posso, no entanto, tentar obter uma versão 0.18.x com quaisquer problemas de segurança, etc corrigidos, se isso for algo que possa ajudar?

Isso seria incrível.

PS: Todos nós apreciamos o trabalho árduo que você está fazendo ao manter um pacote que é complexo para tantos projetos da web. 😊

Posso, no entanto, tentar obter uma versão 0.18.x com quaisquer problemas de segurança, etc corrigidos, se isso for algo que possa ajudar?

Sim, concordo, isso seria definitivamente apreciado.

Se você precisar de ajuda para testar algumas das coisas novas, deixe-me saber que estou aberto para fazer isso.

@adamreisnz você poderia testar este branch: 0.20.0-beta.1

Posso sim, vou tentar mudar para esse ramo neste fim de semana para um de nossos projetos.

@jasonsaayman até agora tudo bem, 0,20.0 parece estar funcionando bem 👍

Parece, o problema pode ser fechado agora

Fechando após receber feedback de que agora está funcionando como deveria no novo lançamento.

Esta página foi útil?
0 / 5 - 0 avaliações