我的 cron 作业始终包含相同的标记值
My cron job is always containing the same token values
我正在尝试创建一个 cron 作业,每分钟都会发出一个 API 请求来刷新会话。在请求中,我发送 refreshToken
作为请求正文。刷新令牌,我从商店获得。以下是我的要求。
api.actions.js
export const getAccessToken = () => {
const { refreshToken } = store.getState(); // getting refreshToken from store
return apiDefaultAction({
url: ACCESS_TOKEN_URL,
method: 'POST',
data: {
refresh_token: refreshToken,
},
onSuccess: apiData => {
return {
type: ACCESS_TOKEN_SUCCESS,
payload: { ...apiData },
};
},
});
};
请求响应是新的 accessToken
和 refreshToken
。
减速器然后用新的 accessToken
和 refreshToken
:
更新商店
export default (state = initialState, action) => {
switch (action.type) {
...
case ACCESS_TOKEN_SUCCESS:
return {
...state,
accessToken: action.payload.accessToken,
refreshToken: action.payload.refreshToken,
};
}
};
我启动了在组件内调用此方法的 cron 作业:
import schedule from 'node-schedule';
const RUN_EVERY_MINUTE = '0 * * * * *';
export const initiateAccessToken = () => {
schedule.scheduleJob(RUN_EVERY_MINUTE, () => {
store.dispatch(getAccessToken());
});
};
然而,当请求每分钟发生时,refreshToken
总是相同的,从第一个状态开始。第一个请求收到 200,其余请求未通过,因为 refreshToken
没有来自商店的更新值并且已过期。
我检查了请求前后的状态,redux 正在更新请求后的 refreshToken
值,但在 cron 作业中始终具有相同的标记。知道为什么会这样吗?
更新
我试过下面的例子,按钮值也没有改变:|
import React from 'react';
import schedule from 'node-schedule';
const RUN_EVERY_10_SEC = '0,10 * * * * *';
const TestComponent = () => {
let value = 0;
schedule.scheduleJob(RUN_EVERY_10_SEC, () => {
value += 1;
});
const Button = <button>{value}</button>;
return <div>{Button}</div>;
};
export default TestComponent;
我认为,原因是因为您的 node-schedule
代码在您第一次 运行 时保存了对任意函数的引用。 这意味着它将始终保留对商店初始状态的引用,这也解释了为什么您看不到更新。
可能最好的解决方案是将商店作为函数的依赖项传递:
import schedule from 'node-schedule';
const RUN_EVERY_MINUTE = '0 * * * * *';
export const initiateAccessToken = (store) => {
schedule.scheduleJob(RUN_EVERY_MINUTE, () => {
store.dispatch(getAccessToken());
});
};
这样您的函数将始终具有对您商店的新的和更新的引用。
我正在尝试创建一个 cron 作业,每分钟都会发出一个 API 请求来刷新会话。在请求中,我发送 refreshToken
作为请求正文。刷新令牌,我从商店获得。以下是我的要求。
api.actions.js
export const getAccessToken = () => {
const { refreshToken } = store.getState(); // getting refreshToken from store
return apiDefaultAction({
url: ACCESS_TOKEN_URL,
method: 'POST',
data: {
refresh_token: refreshToken,
},
onSuccess: apiData => {
return {
type: ACCESS_TOKEN_SUCCESS,
payload: { ...apiData },
};
},
});
};
请求响应是新的 accessToken
和 refreshToken
。
减速器然后用新的 accessToken
和 refreshToken
:
export default (state = initialState, action) => {
switch (action.type) {
...
case ACCESS_TOKEN_SUCCESS:
return {
...state,
accessToken: action.payload.accessToken,
refreshToken: action.payload.refreshToken,
};
}
};
我启动了在组件内调用此方法的 cron 作业:
import schedule from 'node-schedule';
const RUN_EVERY_MINUTE = '0 * * * * *';
export const initiateAccessToken = () => {
schedule.scheduleJob(RUN_EVERY_MINUTE, () => {
store.dispatch(getAccessToken());
});
};
然而,当请求每分钟发生时,refreshToken
总是相同的,从第一个状态开始。第一个请求收到 200,其余请求未通过,因为 refreshToken
没有来自商店的更新值并且已过期。
我检查了请求前后的状态,redux 正在更新请求后的 refreshToken
值,但在 cron 作业中始终具有相同的标记。知道为什么会这样吗?
更新
我试过下面的例子,按钮值也没有改变:|
import React from 'react';
import schedule from 'node-schedule';
const RUN_EVERY_10_SEC = '0,10 * * * * *';
const TestComponent = () => {
let value = 0;
schedule.scheduleJob(RUN_EVERY_10_SEC, () => {
value += 1;
});
const Button = <button>{value}</button>;
return <div>{Button}</div>;
};
export default TestComponent;
我认为,原因是因为您的 node-schedule
代码在您第一次 运行 时保存了对任意函数的引用。 这意味着它将始终保留对商店初始状态的引用,这也解释了为什么您看不到更新。
可能最好的解决方案是将商店作为函数的依赖项传递:
import schedule from 'node-schedule';
const RUN_EVERY_MINUTE = '0 * * * * *';
export const initiateAccessToken = (store) => {
schedule.scheduleJob(RUN_EVERY_MINUTE, () => {
store.dispatch(getAccessToken());
});
};
这样您的函数将始终具有对您商店的新的和更新的引用。