node.js - 如何在拦截器中发送不同的请求?

标签 node.js reactjs typescript axios

我正在尝试在拦截器中发送不同的请求

除了一种情况外,我想在每个请求的请求 header 授权中发送 accessToken

所以我在拦截器request.use中编写了这段代码

config.headers = {authorization: `Bearer ${accessToken}`};

但如果发生此错误

error.response.data.code === 'expired'

我想在 header 授权中发送 refreshtoken 而不是 accesstoken

所以我在interceptor.response.use.error中编写了这段代码

const { data } = await axios.post(
  `${Config.API_URL}/user/refreshToken`,
  {},
  { headers: { authorization: `Bearer ${refreshToken}` } }
);

这是我的代码

useEffect(() => {
  axios.interceptors.request.use(async (config: any) => {
    const accessToken = await EncryptedStorage.getItem("accessToken");
    config.headers = { authorization: `Bearer ${accessToken}` };
    return config;
  });

  axios.interceptors.response.use(
    (response) => {
      return response;
    },
    async (error) => {
      const {
        config,
        response: { status },
      } = error;
      if (status === 419) {
        if (error.response.data.code === "expired") {
          const originalRequest = config;
          const refreshToken = await EncryptedStorage.getItem("refreshToken");
          const { data } = await axios.post(
            `${Config.API_URL}/user/refreshToken`,
            {},
            { headers: { authorization: `Bearer ${refreshToken}` } }
          );
          return axios(originalRequest);
        }
      }
      return Promise.reject(error);
    }
  );
}, [dispatch]);

如何修复我的代码? 如果我使用我的代码 if error.response.data.code === 'expired'

仍在请求 headers.authorization accesstoken。

最佳答案

使您的请求拦截器仅设置默认的 authorization header ,而不覆盖任何已存在的内容

axios.interceptors.request.use(async (config) => {
  const accessToken = await EncryptedStorage.getItem("accessToken");
  return {
    ...config,
    headers: {
      authorization: `Bearer ${accessToken}`,
      ...config.headers
    }
  }
});

您还可以完全避免发出 getItem() 请求,这可能会节省一点时间

axios.interceptors.request.use(async (config) => {
  if (!config.headers.authorization) {
    config.headers.authorization = `Bearer ${await EncryptedStorage.getItem("accessToken")}`
  }
  return config;
});

关于node.js - 如何在拦截器中发送不同的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71950061/

相关文章:

javascript - 关闭 React 应用程序中所有输入的自动完成功能

javascript - 匹配没有 __magic__ 文件夹的路径

javascript - 类型 'void' 不可分配给类型 'FormData'

typescript - 如何循环 Record<K, T>

javascript - 如何将数据从 html 发送到 node.js

angularjs - Node jS API 和 Angular jS 应该在同一个项目中吗?

javascript - jsdom.env() 和 jsdom.jsdom 有什么区别?

javascript - 在 Redux reducer 中添加到无名数组之前

sql-server - 无法使用 react-native 连接到 MS-SQL

node.js - 从 NodeJs 中的一组 url 图片创建动画 Gif