Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
708 views
in Technique[技术] by (71.8m points)

关于 axios 刷新后第一次传后台没有 token

全局配置的 axios,请求拦截处获取 token 并传到后台。刷新页面后第一次请求可以获取到 token,但是没传。不知道为什么,第二次请求就可以了。复现只出现在刷新后请求第一次不传 token。代码如下:

// http请求拦截器
axios.interceptors.request.use(config => {
    let token = window.localStorage.getItem('token');
    !!token ? axios.defaults.headers.common['token'] = token : '';
    alert(axios.defaults.headers.common['token'])
    removePending(config); //在一个axios发送前执行一下取消操作
    config.cancelToken = new cancelToken((c)=>{
        // 这里的axios标识我是用请求地址&请求方式拼接的字符串
        pending.push({ u: config.url + JSON.stringify(config.data) +'&' + config.method, f: c });  
    });
    return Promise.resolve(config)
}, error => {
    return Promise.reject(error)
})

刷新页面,点击按钮执行 axios 请求时候 可以弹出 token(弹窗:上面第五行),但是查看 network中 token 没有传过去
image.png


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

如果我理解的没错的化,你只是要每个 axios 请求都携带 token,没太理解你的代码为什么写的这么复杂,给你一段我写过的代码:

axios.interceptors.request.use(
    config => {
        let token = localStorage.getItem('token')
        if (token && token != '') {
            config.headers.token = token;
        }
        return config;
    },
    error => {
        return Promise.reject(error);
    });

这句

axios.defaults.headers.common['token'] = token

通常是在拦截器外面用的,既然都在拦截器里面了,直接修改 config 就好了。

而且直接返回 config 就好了,起码官方的代码是这么写的。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...