axios 拦截器内的 useContext

2024-04-28

我不明白为什么我的 useContext 没有在这个函数中被调用:

import { useContext } from "react";
import { MyContext } from "../contexts/MyContext.js";
import axios from "axios";

const baseURL = "...";

const axiosInstance = axios.create({
  baseURL: baseURL,
  timeout: 5000,
.
.
.
});
axiosInstance.interceptors.response.use(
  (response) => response,
  async (error) => {
    const { setUser } = useContext(MyContext);
    console.log("anything after this line is not running!!!!");
    setUser(null)

.
.
. 

我的目标是使用拦截器检查令牌是否有效,以及是否未清除用户并进行登录。我在其他反应组件中使用相同的上下文。它在那里工作得很好,只是在这里不运行!知道我做错了什么吗?


我和你有同样的问题。我是这样解决的:

您只能使用useContext在功能组件内部,这就是你无法执行的原因setUser在你的 axios 拦截器中。

您可以做的是创建一个名为的单独文件AxiosErrorHandler:

// AxiosErrorHandler.js

import { useContext, useEffect } from 'react'
import axios from 'axios'

const AxiosErrorHandler = ({ children }) => {
    const { setUser } = useContext(MyContext);

    useEffect(() => {
        const responseInterceptor = axios.interceptors.response.use(response => response, async (error) => {
            setUser(null)
        })

        return () => {
            axios.interceptors.response.eject(responseInterceptor);
        }
    }, [setUser])

    return children
}

export default AxiosErrorHandler

然后添加WithAxios after MyContext.Provider访问您的上下文,例如:

// App.js

const App = () => {
    const [user, setUser] = useState(initialState)

    return (
        <MyContext.Provider value={{ setUser }}>
            <AxiosErrorHandler>
                {/* render the rest of your components here  */}
            </AxiosErrorHandler>
        </MyContext.Provider>
    )
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

axios 拦截器内的 useContext 的相关文章

随机推荐

  • 将我的数据库类与项目中的其他类一起使用

    我有一个自己编写的自定义数据库类 还有一个用户类和一个站点类 MySQL 类有这样的方法 connect query clean fetch 用户等级 register login logout resetPass 站点类别 updateT
  • Python 滚动文本模块

    我想使用scrolledtext模块创建一个ScrolledText小部件 以便在python中创建GUI 我已经成功创建了 ScrolledText 小部件 但是我无法向其添加水平滚动条 e3 ScrolledText window3 w
  • 如何在 laravel 中插入多类别和多列不同类别的帖子?

    大家好 我是一个新的 Laravel 我的项目有问题 我有2张桌子 posts id title category id category id name PHP Laravel Ruby 例如 我想要的结果是 如果我将帖子插入帖子数据库
  • 我无法在 Unity Hub 中激活许可证

    我重新安装了视窗 10 我从官方网站下载了 Unity Hub 运行 unity hub 我看到错误 您没有有效的许可证 错误上有 2 个按钮 管理许可证 和 关闭 我单击 管理许可证 进入 Unity 中心设置中的 许可证管理 页面 单击
  • Java 泛型和数组初始化

    下面这句话的解释是什么 public class GenericsTest statement 1 public ArrayList
  • 如何对 Spring Boot MongoRepository 进行单元测试?

    在我的 Spring Boot Web 应用程序中 我使用 MongoDB 来存储数据 在应用程序中 我使用扩展的接口访问数据库MongoRepository 如何为这样的存储库类设置单元测试 我想要的是 启动 MongoDB 的嵌入式 内
  • 在 Mac OS X 上安装 Crypto++ 5.6.2

    我正在尝试在我的 Mac 上安装 Crypto 5 6 2 当我跑步时 make j4 libcryptopp a 我收到以下错误 libtool unrecognized option static libtool Try libtool
  • 预渲染 vue.js 2.0 组件(类似于 vue 1 中的 this.$compile)

    我正在努力使可重复使用的组件网格堆栈 https github com troolee gridstack js 我找不到一种简单的方法来做类似的事情this compile方法来自vue 1 我见过这个example http codep
  • 在我的例子中以编程方式安装 X509 证书

    我正在开发一个Android项目 我有一个 PEM 证书字符串 BEGIN CERTIFICATE MIIEczCCA1ugAwIBAgIBADANBgkqhkiG9w0BAQQFAD AkGA1UEBhMCR0Ix EzARBgNVBAg
  • 使用不同数据集重新加载和重新启动状态机的正确方法

    我需要相同的 SM 来服务同一数据库表中的各种记录 无法为每个记录创建 SM 这是使用另一条记录中的新状态重新初始化 SM 的合适方法吗 或者您能建议更好的方法吗 public static
  • 如何知道 Android TalkBack 是否处于活动状态?

    我正在开发一个使用 TalkBack 来指导人们完成的应用程序 然而 在这些情况下 我希望应用程序的布局有一些细微的差异 以便导航更容易 并且还有额外的语音输出 使用 TextToSpeech 来帮助指导用户 我的问题是 如果用户激活了 T
  • 使用Qt设置http get请求参数

    我正在 Qt 中开发一个基本应用程序 它使用 REST API 从 Parse com 检索数据 我浏览了一些类参考和 cURL 手册 但仍然不清楚如何设置请求参数 例如 我想对用户进行身份验证 这是 Parse 提供的curl 示例 cu
  • 外部类调用内部类的方法

    我知道要实例化成员内部类 您有两个不同的构造函数 First Outer out new Outer Outer Inner in out new Inner Second Outer Inner in new Outer new Inne
  • 间歇性的“事件循环在 Future 完成之前停止。”

    我一直在为这个问题抓狂 有问题的代码是此处开源项目的一部分 aiosmtpd https github com pepoluan aiosmtpd 我的实际 FOSS 项目的分支 here https github com aio libs
  • Python 文档的 reStructuredText 有真正的替代品吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我很快就要开始一个开源 Python 项目 并且我试图提前决定如何编写我的文档字符串 显而易见的答案是
  • php ftp 检查文件夹是否存在总是返回创建文件夹错误

    有人可以告诉我这段代码中做错了什么吗 if id if is dir public html tem pasta path pics id echo pasta j existia destination file public html
  • jnius 1.1导入错误

    当我想导入 jnius 时出现如下错误 Traceback most recent call last File C Python27 lib site packages jnius init py line 12 in
  • 使用 oauth azure 数据工厂进行分页

    在 Azure 数据工厂内 我通过 REST 复制活动调用 microsoft graph 利用 REST 来获取服务的访问令牌 Graph api 最多返回 200 个结果 因此我有兴趣使用可以在源中创建的分页规则 在邮递员中我可以看到我
  • window.location 的 .NET MVC jQuery 相对路径

    我有一个非常简单的问题 但似乎无法弄清楚 由于 MVC 构建 URL 的方式 它包括所有路由信息 以下内容不起作用 我希望路径名仅返回虚拟目录路径 我所做的只是当用户从下拉列表中选择 ID 时重定向到不同的路由 document ready
  • axios 拦截器内的 useContext

    我不明白为什么我的 useContext 没有在这个函数中被调用 import useContext from react import MyContext from contexts MyContext js import axios f