我想在传递给 redux saga 之前拦截 api 调用,以检查是否需要刷新 Access Token
I want to intercept api calls before they are passed on to redux saga to check whether Access Token needs to be refreshed
我在我的项目中使用 redux saga 来发送 api 调用,现在我想在每次调用之前检查访问令牌的到期时间。
流程将在发送每个调用之前,检查访问令牌是否即将过期。
如果它即将过期,我将使用我的访问和刷新令牌发送刷新令牌调用,一旦我取回新的访问令牌,我将发送我的原始调用以及这个新的访问令牌。
经过研究我意识到我需要一个中间件(除了 saga 中间件),来拦截这些调用并检查访问令牌是否已过期,如果是则调度刷新令牌调用并在成功响应后发送正在等待的调用。
因此,我按照以下教程创建了另一个中间件,
https://www.metaltoad.com/blog/overview-redux-middleware-react-applications
但是这个新的中间件没有被触发。
这是我的应用商店,
const sagaMiddleware = createSagaMiddleware();
const JWTMiddleware = createSagaMiddleware();
const middleware = [];
// middleware.push(JWTMiddleware);
middleware.push(sagaMiddleware);
const componseEnhancers =
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const AppStore = createStore(
AppReducers,
componseEnhancers(applyMiddleware(...middleware, JWTMiddleware))
);
// JWT Middleware
JWTMiddleware.run(jwtSaga);
// // saga middleware
sagaMiddleware.run(rootSaga);
export default AppStore;
我的 saga 中间件
export default function* rootSaga() {
yield all([...UsersSagas, ...CustomerSagas, ...CommentSagas, ...OpportunitySagas]);
}
和我的新中间件,我现在正尝试对其进行初始化,
// export default function* jwtSaga() { // I removed this line because I want the next action, like //below
const jwtSaga = (store) => (next) => (action) => {
console.log("dispatching", action);
console.log("previous state", store.getState());
next(action);
console.log("new state", store.getState());
};
// }
任何人都可以指导我中间件是否是我描述的流程的正确选择,如果是的话我在创建它时做错了什么?
所以我只需要删除这一行,
const sagaMiddleware = createSagaMiddleware();
我没有在 applyMiddleware 中添加 JWTMIddleware,而是取消了以下行的注释,
middleware.push(JWTMiddleware);
我的中间件现在可以工作了。
我在我的项目中使用 redux saga 来发送 api 调用,现在我想在每次调用之前检查访问令牌的到期时间。 流程将在发送每个调用之前,检查访问令牌是否即将过期。 如果它即将过期,我将使用我的访问和刷新令牌发送刷新令牌调用,一旦我取回新的访问令牌,我将发送我的原始调用以及这个新的访问令牌。 经过研究我意识到我需要一个中间件(除了 saga 中间件),来拦截这些调用并检查访问令牌是否已过期,如果是则调度刷新令牌调用并在成功响应后发送正在等待的调用。 因此,我按照以下教程创建了另一个中间件, https://www.metaltoad.com/blog/overview-redux-middleware-react-applications
但是这个新的中间件没有被触发。 这是我的应用商店,
const sagaMiddleware = createSagaMiddleware();
const JWTMiddleware = createSagaMiddleware();
const middleware = [];
// middleware.push(JWTMiddleware);
middleware.push(sagaMiddleware);
const componseEnhancers =
window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const AppStore = createStore(
AppReducers,
componseEnhancers(applyMiddleware(...middleware, JWTMiddleware))
);
// JWT Middleware
JWTMiddleware.run(jwtSaga);
// // saga middleware
sagaMiddleware.run(rootSaga);
export default AppStore;
我的 saga 中间件
export default function* rootSaga() {
yield all([...UsersSagas, ...CustomerSagas, ...CommentSagas, ...OpportunitySagas]);
}
和我的新中间件,我现在正尝试对其进行初始化,
// export default function* jwtSaga() { // I removed this line because I want the next action, like //below
const jwtSaga = (store) => (next) => (action) => {
console.log("dispatching", action);
console.log("previous state", store.getState());
next(action);
console.log("new state", store.getState());
};
// }
任何人都可以指导我中间件是否是我描述的流程的正确选择,如果是的话我在创建它时做错了什么?
所以我只需要删除这一行,
const sagaMiddleware = createSagaMiddleware();
我没有在 applyMiddleware 中添加 JWTMIddleware,而是取消了以下行的注释,
middleware.push(JWTMiddleware);
我的中间件现在可以工作了。