如何解决Axios拦截器重试发送FormData
我正在尝试为包含FormData
作为数据的请求创建“重试”功能。
重试发生在JWT令牌过期时,我的第二个请求(重试一个)不包含任何数据。
想法:
const axiosInstance = axios.create();
/**
* Before each request,we'll add a possible retry if the
* request need a refreshed token
*/
axiosInstance.interceptors.request.use((request) => {
if (typeof _.get(request,['retried']) === 'undefined') {
request.retried = false;
}
return request;
});
/**
* After a request with an error,we'll check if the error is a token not refreshed.
* If we didn't already tried to refresh,we'll just fallback to the errorHandler function
*/
axiosInstance.interceptors.response.use(null,async (error) => {
const statusCode = _.get(error,['response','data','statusCode']);
const message = _.get(error,'message']);
const { config: request = {} } = error;
if (statusCode === 401 && !request.retried) {
try {
const newTokens = await refreshTokens();
request.retried = true;
_.set(request,['headers','authorization'],newTokens.accessToken);
return axiosInstance.request(request);
} catch (e) {
return error;
}
}
return error;
});
请求:
const formData = new FormData();
formData.append('name',name);
formData.append('file',fs.createReadStream(file.path));
axiosInstance.post(
'http://localhost/upload',formData,{
headers: {
...formData.getHeaders(),authorization: tokens.accessToken
}
}
);
如果我的令牌过期,请求将失败,拦截器将刷新我的令牌,并仅使用新的头文件Authorization
重试完全相同的请求。但是,在服务器端,接收到的有效载荷始终为空。
解决方法
据我所知,需要在重试中再次添加formData(我认为这是由于数据作为流添加并在请求期间被消耗,因此新的重试无法消耗已经消耗的流)
您可以看看request.data
来了解我的意思。
您可以在 config 参数中传递表单数据:
axiosInstance.post(
'http://localhost/upload',{},{
data: formData,// <---- pass it here
headers: {
...formData.getHeaders(),authorization: tokens.accessToken
}
}
);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。