我正在我的网络应用程序中实现令牌身份验证.我的access token每N分钟过期,而不是refresh token用于登录并获得新的access token.
我使用Axios进行所有API调用.我有拦截器设置来拦截401响应.
axios.interceptors.response.use(undefined, function (err) {
if (err.status === 401 && err.config && !err.config.__isRetryRequest) {
serviceRefreshLogin(
getRefreshToken(),
success => { setTokens(success.access_token, success.refresh_token) },
error => { console.log('Refresh login error: ', error) }
)
err.config.__isRetryRequest = true
err.config.headers.Authorization = 'Bearer ' + getAccessToken()
return axios(err.config);
}
throw err
})
Run Code Online (Sandbox Code Playgroud)
基本上,当我拦截401响应时,我想进行登录,然后使用新令牌重试原始被拒绝的请求.我的serviceRefreshLogin函数调用setAccessToken()它的then块.但问题是then阻塞发生的时间晚于getAccessToken()拦截器,因此重试发生在旧的过期凭证上.
getAccessToken()并getRefreshToken()简单地返回存储在浏览器中的现有标记(它们管理localStorage,cookies等).
在承诺返回之前,我将如何确保语句不会执行?
(这是github上的相应问题:https://github.com/mzabriskie/axios/issues/266)
使用 jest 运行测试时,我有基本的测试服语法:
jest.mock('axios');
describe('app', () => {
let render
beforeEach(() => {
axiosMock.get.mockResolvedValueOnce({
data: {greeting: 'hello there'},
}),
render= renderApp()
});
test('should render something', () => {
expect(something).toBeInTheDocument();
});
});
Run Code Online (Sandbox Code Playgroud)
问题是我的代码中有拦截器,当使用 jest 命令输出运行测试时:
类型错误:无法读取未定义的属性“拦截器”
并指向拦截器对象
axiosInstance.interceptors.request.use(...
axiosInstance 是存储返回的变量 axios.create
export const axiosInstance = axios.create({...
在 SO How do I test axios in jest上参考了这个 axios 线程,但它不涉及任何拦截器,所以并没有真正的帮助。