首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在axios拦截器中编写重定向而不重新加载

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

Stack Overflow用户
提问于 2019-07-09 12:30:36
回答 3查看 7.3K关注 0票数 7

我使用axios拦截器来维护内部服务器错误。如果响应有错误而没有重新加载,我需要重定向到另一个url。下面的代码我使用了location.href。所以它在重新装货。我需要一个不刷新页面就可以重定向的解决方案。

我试过“重定向”在反应路由器。但这对我不管用。

代码语言:javascript
复制
export function getAxiosInstance() {
    const instance = axios.create();
    const token    = getJwtToken();

    // Set the request authentication header
    instance.defaults.headers.common['Authorization'] = `Bearer ${token}`;

    // Set intercepters for response
    instance.interceptors.response.use(
        (response) => response,
        (error) => {
            if (config.statusCode.errorCodes.includes(error.response.status)) {
                return window.location.href = '/internal-server-error';
            }

            return window.location.href = '/login';
        }
    );

    return instance;
}

有人能帮我解决这个问题吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-07-09 12:50:02

这将利用导入缓存的优势。

代码语言:javascript
复制
// history.js
import { createBrowserHistory } from 'history'

export default createBrowserHistory({
  /* pass a configuration object here if needed */
})


// index.js (example)
import { Router } from 'react-router-dom'
import history from './history'
import App from './App'

ReactDOM.render((
  <Router history={history}>
    <App />
  </Router>
), holder)


// interceptor.js
import axios from 'axios';
import cookie from 'cookie-machine';
import history from '../history';

axios.interceptors.response.use(null, function(err) {
  if ( err.status === 401 ) {
    cookie.remove('my-token-key');
    history.push('/login');
  }

  return Promise.reject(err);
});
票数 4
EN

Stack Overflow用户

发布于 2021-07-09 09:51:29

我通过将useHistory()<Router>内部传递给axios拦截器来解决这个问题。

App.js:

代码语言:javascript
复制
// app.js

function App() {
  return (
    <Router>
      <InjectAxiosInterceptors />

      <Route ... />
      <Route ... />
    </Router>
  )
}

InjectAxiosInterceptors.js:

代码语言:javascript
复制
import { useEffect } from "react"
import { useHistory } from "react-router-dom"
import { setupInterceptors } from "./plugins/http"

function InjectAxiosInterceptors () {
  const history = useHistory()

  useEffect(() => {
    console.log('this effect is called once')
    setupInterceptors(history)
  }, [history])

  // not rendering anything
  return null
}

plugins/http.js:

代码语言:javascript
复制
import axios from "axios";

const http = axios.create({
  baseURL: 'https://url'
})

/**
 * @param {import('history').History} history - from useHistory() hook
 */
export const setupInterceptors = history => {
  http.interceptors.response.use(res => {
    // success
    return res
  }, err => {
    const { status } = err.response
  
    if (status === 401) {
      // here we have access of the useHistory() from current Router
      history.push('/login')
    }
  
    return Promise.reject(err)
  })
}

export default http
票数 1
EN

Stack Overflow用户

发布于 2019-07-09 12:39:25

您应该使用历史记录对象来推送新位置。检查这个问题,How to push to History in React Router v4?。这会有帮助的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56952642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档