首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在动作创建者中的Axios请求之后调用Redux中间件刷新令牌。

在动作创建者中的Axios请求之后调用Redux中间件刷新令牌。
EN

Stack Overflow用户
提问于 2019-10-12 12:18:43
回答 2查看 3K关注 0票数 1

如果令牌过期,我将创建一个redux中间件,在任何请求之前刷新令牌。

问题是,在第一个调用之后,我总是得到error 400 bad request,但是如果进行了另一个调用(这是分页请求休息),它可以正常工作,因为令牌被刷新了。

我注意到Axios请求是在新令牌传入之前和设置新的Axios授权头之前触发的,所以我尝试让中间件异步等待,但仍然没有成功.

代码语言:javascript
运行
复制
import {
    getJWT,
    isTokenExpired
} from "../util/helpers";
import Cookies from "js-cookie";
import axios from "axios";

const refreshTokenMiddleware = store => next => async action => {
    if (!action.excludeFromRefresh) {
        const token = getJWT();
        if (token && isTokenExpired()) {
            try {
                const { data } = await axios.post("auth/refresh");
                axios.defaults.headers.common[
                    "Authorization"
                ] = `Bearer ${data.data.access_token}`;
                Cookies.set("AppToken", data.data.access_token);
                next(action);
            } catch (error) {
                console.log(error);
            }

        } else {
            next(action);
        }
    } else {
        next(action);
    }
};

export default refreshTokenMiddleware;

我还怀疑第一次用旧令牌调用Axios请求。

我在这里做错什么了?

=====================

编辑

我试图将中间件全部丢弃,并实现axios拦截器,因为中间件没有捕获axios请求.

代码语言:javascript
运行
复制
axios.interceptors.request.use(
    function(config) {
        // Do something before request is sent
        if (
            config.url !== "auth/refresh" &&
            config.url !== "auth/login" &&
            config.url !== "auth/register"
        ) {
            const token = getJWT();

            if (token && isTokenExpired()) {
                axios.post("auth/refresh").then(res => {
                    config.headers.Authorization = `Bearer ${res.data.data.access_token}`;
                    console.log(
                        "Inside the refresh in interceptor",
                        res.data.data.access_token
                    );
                    return config;
                });
            }
        }
        return config;
    },
    function(error) {
        // Do something with request error
        return Promise.reject(error);
    }
);

但这似乎也不起作用,请求第一次用授权头中的旧令牌触发。

我能做什么?

EN

Stack Overflow用户

发布于 2019-10-12 17:14:07

乍一看,这个if语句是错误的,因为您试图同时检查url是否有三个不同的值,我认为您应该在这里使用||操作符。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58354086

复制
相关文章

相似问题

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