在 Next.js 中,如何在 axios 拦截器中重定向页面?

Posted

技术标签:

【中文标题】在 Next.js 中,如何在 axios 拦截器中重定向页面?【英文标题】:In Next.js, How to Redirect page in axios interceptor? 【发布时间】:2022-01-09 11:20:33 【问题描述】:

我想在 axios 拦截器中重定向页面。

但是,当服务器端渲染时,我无法在 axios 拦截器中访问服务器端上下文。所以我尝试使用下一个/路由器。但它只适用于客户端。

我怎么能这样?

下面是axios拦截器中执行的函数

// customAxios.ts
const customAxios = axios.create();

customAxios.interceptors.response.use((response) => response, responseErrorHandler);
// responseErrorHandler.ts
const responseErrorHandler = (error: AxiosError): Promise<AxiosError> => 
  if (error.response) 
    if (error.message === TIMEOUT_MESSAGE) 
      if (typeof window === 'undefined') 
         // Redirect to /503 page in server side rendering
       else 
        window.location.href = '/503';
      
    
  

  return Promise.reject(error);

【问题讨论】:

【参考方案1】:

如果没有看到 getServerSidePropsgetStaticProps 的实际实现,很难给出答案,但这可能会有所帮助。 您的拦截器可能会抛出您可以在这些方法中识别的自定义错误,然后使用Next.js redirects

// responseErrorHandler.ts
const responseErrorHandler = (error: AxiosError): Promise<AxiosError> => 
  if (error.response) 
    if (error.message === TIMEOUT_MESSAGE) 
      if (typeof window === 'undefined') 
         throw new CustomError(); //Throw custom error here
       else 
        window.location.href = '/503';
      
    
  

  return Promise.reject(error);

然后,在取数据的方法中(需要适配Typesctipt):

export async function getServerSideProps(context) 

  try 
    await customAxios.get(...)
   catch(e) 
    if (e instanceof CustomError)
      return 
        redirect: 
          destination: '/503'
        
      ;
     else  
        //...
    
  

  //...

【讨论】:

谢谢。我会看看。谢谢:)

以上是关于在 Next.js 中,如何在 axios 拦截器中重定向页面?的主要内容,如果未能解决你的问题,请参考以下文章

Next Js - 如何从需要授权的api中检索数据(通过axios)?

如何在 axios 拦截器中设置 http cookie?

如何在.onRequest拦截器中使用axios helper setToken

Next.js 使用 SWR 和 axios

如何在 axios 拦截器中编写重定向而不在 React JS 中重新加载

如何使用 React Router V4 从 axios 拦截器重定向?