Моя работа cron всегда содержит одинаковые значения токенов - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь создать задание cron, которое каждую минуту будет отправлять запрос API для обновления sh сеанса. В запросе отправляю refreshToken как тело запроса. Токен refre sh, я получаю его из магазина. Ниже - мой запрос.

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 не имеет обновленного значения из хранилища, и срок его действия истек.

Я проверил состояния до и после обновления приставки запроса значения 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;

1 Ответ

1 голос
/ 25 марта 2020

Я полагаю, что причина в том, что ваш код node-schedule сохраняет ссылку на вашу произвольную функцию при первом ее запуске. Это означает, что он всегда будет сохранять ссылку на магазин в его начальном состоянии и объясняет, почему вы не видите обновления.

Вероятно, лучшее решение - передать магазин как зависимость от функции:

import schedule from 'node-schedule';

const RUN_EVERY_MINUTE = '0 * * * * *';

export const initiateAccessToken = (store) => {
  schedule.scheduleJob(RUN_EVERY_MINUTE, () => {
    store.dispatch(getAccessToken());
  });
};

Таким образом, ваша функция всегда будет иметь новую и обновленную ссылку на ваш магазин.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...