reactjs - 处理 axios react-redux 应用程序中的 401 未授权错误
问题描述
我想在我的服务器输出它时处理 401 未经授权的错误,我想调度一个动作来做到这一点。我看到很多人都在使用 axios.interceptors 我该怎么做。什么是拦截器?请详细解释它是什么并帮助我。我是 react-redux 框架的新手。这是我的快递路线处理程序:
router.get('/api/me', function(req, res) {
if(req.user) {
res.status(200).send({
email : req.user.local.email,
isCurrentUser: true
});
}else {
res.status(401).send({
isCurrentUser: false
})
}
})
这是我的异步动作创建者:
export const fetchCurrentUser = () => {
return async (dispatch) => {
const res = await axios.get(`${ROOT_URL}/me`);
if(res.status === 200) {
dispatch({ type: types.YES_FETCH_CURRENT_USER, payload: res.data });
}else if(res.status === 401) {
dispatch({type: types.NO_FETCH_CURRENT_USER})
}
}
};
解决方案
拦截器是内部的东西axios
。您可以将拦截器与 express 中的中间件进行比较。您使用拦截器
- 在请求被执行之前拦截它。
- 在您将响应作为 Promise 处理之前拦截响应。
可以在此处找到有关其用法的文档。
在您的情况下,您可以执行以下操作:
const aiosInstance = axios.create();
axiosInstance.interceptors.response.use(
(response) => response,
(error) => {
if (error.response.status === 401) {
// dispatch something to your store
}
return Promise.reject(error);
}
)
axiosInstance.get(`${ROOT_URL}/me`);
上面的例子确实意味着你必须导入你的 redux 存储实例来直接调度一个动作。
根据以下对话编辑了我的答案:
尝试:
export const fetchCurrentUser = () => async (dispatch) => {
try {
const res = await axios.get(`${ROOT_URL}/me`);
dispatch({ type: types.YES_FETCH_CURRENT_USER, payload: res.data });
} catch (err) {
dispatch({type: types.NO_FETCH_CURRENT_USER})
}
};
推荐阅读
- javascript - 设置选定的选项不起作用
- javascript - 仅基于 JavaScript 中的一个属性返回整个对象?
- python - 将存储在字典中的值添加为值列表
- vue.js - 在 vue jest 测试中模拟 axios 的自定义实例
- java - 返回具有父类类型的子时类型不匹配
- python - 用 dummy 覆盖所有类方法
- typescript - 打字稿:如何从对象内引用文字对象的其他道具?
- bash - 新行分隔参数被视为 shell 脚本中的一个位置参数
- css - Bootstrap DatePicker:与擦除文本事件的从到同步
- javascript - 如何从浏览器启动外部应用程序,例如 Telegram url 链接?