Как обновить токен доступа для длительного процесса с помощью Javascript и Node.js.

Jan 08 2023
В этом разделе мы смоделируем, как обновить токен, полученный из внешнего API, на основе его даты истечения срока действия, чтобы избежать ошибки недопустимого токена. Перво-наперво убедитесь, что у вас установлен Node.
Фото Даниэль Райс на Unsplash

В этом разделе мы смоделируем, как обновить токен, полученный из внешнего API, на основе его даты истечения срока действия, чтобы избежать ошибки недопустимого токена.

Перво-наперво убедитесь, что вы Node.jsустановили его на свой компьютер.

Затем давайте создадим наш файл js, например:process.js

/**
 * Make token
 * @param {number} length Token length
 * @param {number} expires_in Token expiration in seconds, default: 5 secs
 *
 * @return {Array}
 */
const makeToken = (length, expires_in = 5) => {
  let token = '';
  const characters =
    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
  const charactersLength = characters.length;
  for (var i = 0; i < length; i++) {
    token += characters.charAt(Math.floor(Math.random() * charactersLength));
  }
  return [token, expires_in];
};

/**
 * Utility to simulate asynchronous call
 * @param {number} milliseconds Time to wait in ms
 *
 * @return {Promise}
 */
const delay = (milliseconds) =>
  new Promise((resolve) => setTimeout(resolve, milliseconds));


/** Process */
(async () => {
  const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  const processStartDate = Date.now();

  let renewTokenDate = processStartDate;
  let [token, expires_in] = makeToken(40);
  let tokenIsInvalid = expires_in - 1 <= (Date.now() - renewTokenDate) / 1000;

  await delay(1000);
  console.log('token >', token);

  for (const row of data) {
    if (tokenIsInvalid && token) {
      console.log(`token expired > ${token}`, tokenIsInvalid);
      renewTokenDate = Date.now();
      [token, expires_in] = makeToken(40);

      await delay(1000);
      console.log('got new token', token);
    }

    console.info('token is valid >', !(tokenIsInvalid && token));
    console.log('row value >', row);

    await delay(1000);
    console.log('DATA FETCHED for >', row);
  }

  const processEndDate = Date.now();
  console.log('DONE in ', (processEndDate - processStartDate) / 1000, 's');
})();

Таким образом, внутри цикла For перед вызовом delayфункции мы проверяем действительность токена, сравнивая его значение истечения срока действия с подструктурой текущего момента, возвращаемой функцией, Date.now()и временем последнего получения действительного токена.

Если токен все еще действителен, мы проигнорируем условие if и продолжим наш процесс, в противном случае мы создадим новый действительный токен, чтобы избежать какой-либо ошибки авторизации.

Надеюсь это поможет :)