Axios: Definir baseURL em interceptores não está funcionando.

Criado em 9 jun. 2017  ·  3Comentários  ·  Fonte: axios/axios

Resumo

definir baseURL em interceptores não está funcionando.

const service = axios.create({
  baseURL: 'http://localhost/'
});

service.interceptors.request.use(config => {

  config.baseURL = 'dd'
  console.log(config.url) // output :  http://localhost/././../

  return config;
}, error => {
  // Do something with request error
  console.error(error); // for debug
  Promise.reject(error);
})

Contexto

  • versão axios: por exemplo: v0.16.2
  • Ambiente: por exemplo: node vv8.0.0, chrome 59.0.3071.86, macOS 10.12

Comentários muito úteis

Experimentou o mesmo problema. Pode ser mais uma questão conceitual do que um detalhe de implementação. Parece-me que definir um baseURL é uma maneira de dizer "prefixe isso a cada solicitação", o que parece meio sem sentido quando você define em cada solicitação. Embora um caso definitivamente pudesse ser feito para uma condicional como:

axios.interceptors.request.use((config) => {
  return getAge()
  .then((age) => {
    if(age < 10){ config.baseURL = 'https://young.com' }
    else { config.baseURL = 'https://young.com' }
  })

Mas não funciona. Definir um padrão global como este:
axios.defaults.baseURL = 'https://example.com';
assim como passar uma configuração com a solicitação:
axios.post('/extra', { baseURL: 'https://example.com' })

Em ambos os casos, o campo 'url' da configuração é ' https://example.com/extra ', mas definir o baseURL no interceptor atualiza apenas 'config.baseURL'. Quer dizer, faz sentido, você está literalmente apenas atualizando esse campo, mas seria bom se ele atualizasse o campo url também ou pelo menos mencionasse na documentação (de preferência em letras grandes em negrito) que definir baseURL em um interceptor é inútil / não recomendado.

@ Baoyx007 você sempre pode apenas alterar o valor 'url' na configuração manualmente

service.interceptors.request.use(config => {
  //config.baseURL = 'dd'
    config.url = BASE_URL + config.url
  return config;

ou em cada pedido

axios.get('/hello', { baseURL: BASE_URL })

Node v7.10.0
Axios v0.16.12

Todos 3 comentários

olhe para mim Padrões de instância personalizados axios.all não é uma função # 948 meu trabalho normal apenas tudo não é uma função

Experimentou o mesmo problema. Pode ser mais uma questão conceitual do que um detalhe de implementação. Parece-me que definir um baseURL é uma maneira de dizer "prefixe isso a cada solicitação", o que parece meio sem sentido quando você define em cada solicitação. Embora um caso definitivamente pudesse ser feito para uma condicional como:

axios.interceptors.request.use((config) => {
  return getAge()
  .then((age) => {
    if(age < 10){ config.baseURL = 'https://young.com' }
    else { config.baseURL = 'https://young.com' }
  })

Mas não funciona. Definir um padrão global como este:
axios.defaults.baseURL = 'https://example.com';
assim como passar uma configuração com a solicitação:
axios.post('/extra', { baseURL: 'https://example.com' })

Em ambos os casos, o campo 'url' da configuração é ' https://example.com/extra ', mas definir o baseURL no interceptor atualiza apenas 'config.baseURL'. Quer dizer, faz sentido, você está literalmente apenas atualizando esse campo, mas seria bom se ele atualizasse o campo url também ou pelo menos mencionasse na documentação (de preferência em letras grandes em negrito) que definir baseURL em um interceptor é inútil / não recomendado.

@ Baoyx007 você sempre pode apenas alterar o valor 'url' na configuração manualmente

service.interceptors.request.use(config => {
  //config.baseURL = 'dd'
    config.url = BASE_URL + config.url
  return config;

ou em cada pedido

axios.get('/hello', { baseURL: BASE_URL })

Node v7.10.0
Axios v0.16.12

Fixo em # 950

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