与客户拦截器一起使用时,Axios捕获不起作用

乌萨马·纳德姆(Usama Nadeem)

我正在使用拦截器,该拦截器在状态代码为时刷新访问令牌,401但我catch已停止处理任何其他错误代码,例如400

request.js

import axios from 'axios'

const axiosApiInstance = axios.create()

axiosApiInstance.interceptors.response.use(
    (response) => {
      return response
    },
    (error) => {
      return new Promise((resolve) => {
        const originalRequest = error.config
        const refreshToken = localStorage.getItem("refresh")
        if (error.response && error.response.status === 401 && error.config && !error.config.__isRetryRequest && refreshToken) {
          originalRequest._retry = true
  
          const response = fetch('http://127.0.0.1:8000/api/token/refresh/', {
            method: 'POST',
            headers: {
              'Content-Type': 'application/json',
            },
            body: JSON.stringify({
              refresh: refreshToken,
            }),
          })
            .then((res) => res.json())
            .then((res) => {
              localStorage.setItem("access", res.access) 
              originalRequest.headers['Authorization'] = 'Bearer ' + res.access
              return axios(originalRequest)
            })
          resolve(response)
        }
        return Promise.reject(error)
      })
    },
  )

  export default axiosApiInstance
马修·布鲁克斯(Matthew Brooks)

您需要将第二个参数传递给callback,以new Promise调用reject,然后使用该函数而不是拒绝promise Promise.reject

没有测试,我无法验证,这现在很难设置,但是看起来很像是您没有正确地拒绝从错误回调返回的承诺。如果您可以确定在的情况下诺言从未得到解决或拒绝400,那将有助于确认我的怀疑。不过,请尝试进行此更改:

新的Promise回调的参数:

      return new Promise((resolve) => {

变成

      return new Promise((resolve, reject) => {

然后拒绝,而不是

        return Promise.reject(error)

只是这样做

        reject(error) // return does nothing here, can be omitted

编辑:

虽然,有人很好地指出这是一个有前途的反模式。您无缘无故地在创建一个新的Promise。

import axios from 'axios'

const axiosApiInstance = axios.create()

axiosApiInstance.interceptors.response.use(
    (response) => {
      return response
    },
    (error) => {
        const originalRequest = error.config
        const refreshToken = localStorage.getItem("refresh")
        if (error.response && error.response.status === 401 && error.config && !error.config.__isRetryRequest && refreshToken) {
            originalRequest._retry = true

            return fetch('http://127.0.0.1:8000/api/token/refresh/', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                refresh: refreshToken,
            }),
            })
            .then((res) => res.json())
            .then((res) => {
                localStorage.setItem("access", res.access) 
                originalRequest.headers['Authorization'] = 'Bearer ' + res.access
                return axios(originalRequest)
            })
        }
        return Promise.reject(error)
    },
  )

  export default axiosApiInstance

应该是这样的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在axios拦截器中使用时,redux分发不起作用

反应Axios拦截器并创建不起作用

与ThrowsA一起使用时,TypeMatcher不起作用

let 与 -XRankNTypes 一起使用时不起作用

自定义授权器与AWS Chalice一起使用时不起作用

与Onsen UI一起使用时,Videogular控制器不起作用

休眠拦截器不起作用

文件拦截器不起作用

Axios 请求拦截器在浏览器刷新时不起作用

Axios请求拦截器在我的Vue应用程序中不起作用

React.setState 在 Axios 拦截器中不起作用

当与react-hook-form的控制器一起使用时,MUI Autocomplete的'defaultValue'不起作用

使用react-bootstrap进行的下拉列表在构建静态文件中起作用,但在与Web服务器一起使用时不起作用

与apache Alias一起使用时,htaccess文件存在的检查似乎不起作用

将UpdateOne与MongoDB Golang驱动程序一起使用时Upsert不起作用

htmlentities()与表中的数据一起使用时不起作用

与 python3 一起使用时,ConfigParser 库不起作用

Python Pandas:与apply()一起使用时功能不起作用

与Google App Engine和Flask一起使用时,角线路线不起作用

Laravel 5-与重定向一起使用时withInput不起作用

与Ionic Framework一起使用时,Charset UTF 8不起作用

Ansible 设置模块的过滤器在与 playbook 一起使用时不起作用

与plt.show一起使用时cv2.imshow不起作用

与popen python一起使用时,输入命令似乎不起作用

Bootstrap切换chechkbox与html helper chechkboxfor一起使用时不起作用?

:selected与rails形式的collection_select一起使用时不起作用

与Sass功能一起使用时,Sass分割不起作用

与“手表”一起使用时,“ awk”不起作用

与Radium和Material-UI一起使用时,React悬停样式不起作用