【问题标题】:Alert() pops up twice in axios interceptor (Vue.js)Alert() 在 axios 拦截器(Vue.js)中弹出两次
【发布时间】:2019-12-19 14:34:09
【问题描述】:

在我的 Vue 应用程序中,我实例化了一个 axios 实例,并在整个应用程序中使用它来处理 HTTP 请求。我已经设置了一个响应拦截器,它检查来自后端的任何响应是否为401 unauthorized,如果是,则显示一条警报消息。这个基本流程已经实现,但是您需要在警报消息上点击两次“确定”才能让它消失,我不知道为什么。

Axios 实例:

import axios, { AxiosError, AxiosInstance, AxiosResponse } from 'axios';

const axiosInstance: AxiosInstance = axios.create();

axiosInstance.interceptors.response.use(
  (response: AxiosResponse) => response,
  (error: AxiosError) => {
    if(error.response && error.response.status === 401) {
      alert('There has been an issue. Please log out and then log in again.');
      return Promise.reject(error);
    }
  }
);

export default axiosInstance;

响应被拦截的请求:

import axiosInstance from 'axios-instance';

  public async getloggedInUserId() {
    await axiosInstance.get('/sessions.json')
      .then((response) => {
        if(response.data.user_id) {
          this.SET_USER_ID(response.data.user_id);
        }
      });
  }

我已阅读此主题,但我的问题似乎有所不同:Javascript alert shows up twice

我尝试将 return 语句从 return Promise.reject(error); 更改为 return false;,但这对我没有任何帮助。

【问题讨论】:

  • 检查浏览器的网络控制台
  • 能否请您检查并验证function getloggedInUserId是否没有被调用两次?
  • 仅供参考,可能是也可能不是问题,但将您的 return Promise.reject(error) out 移出您的 if(即,向下两行)。有了它,任何非 401 HTTP 错误都将被视为成功
  • @Phil 检查网络控制台让我可以确定调用第二个alert() 的确切位置,删除它解决了问题 - 谢谢!
  • 如果您认为您的解决方案可以帮助其他人,请随时在下面发布您自己的答案。否则,您可以直接关闭问题

标签: javascript typescript vue.js axios alert


【解决方案1】:

正如 Phil 在上面的评论中所建议的那样,查看浏览器控制台中的 Network 选项卡帮助我解决了这个问题。控制台显示了页面中的每个组件是如何与生成的响应代码一起加载的。简而言之,两个进程实际上返回了401,这就是alert 被调用两次的原因。

我决定将调用 alert 的代码从全局 axios 拦截器(每当任何进程返回 401 时调用)移动到一个特定 axios 进程内的 .catch 块,以便它只被调用一次。

【讨论】:

    【解决方案2】:

    你的 promise 在 axios 错误拦截器中抛出错误,并且错误被第二次调用。

    【讨论】:

    猜你喜欢
    • 2021-05-10
    • 2017-11-25
    • 2022-01-25
    • 1970-01-01
    • 2018-11-01
    • 2021-01-18
    • 2016-09-10
    • 2022-11-03
    • 2023-04-06
    相关资源
    最近更新 更多