В браузере заканчиваются ресурсы после внедрения кода (net :: ERR_INSUFFICIENT_RESOURCES) - PullRequest
0 голосов
/ 06 мая 2020

Предпосылки

Я слежу за крупномасштабным учебником по созданию MMORPG с HTML5, Javascript, Phaser 3, node.js, Express и socket.io. Учебники были великолепны, и каждый раз, когда я сталкиваюсь с проблемой с моим (или их) кодом, мне обычно нравится процесс отладки и поиска собственных решений. Это не относится к этой проблеме!

Кажется, я не могу понять, почему код учебника работает, а мой - нет. Все работало нормально, пока я не реализовал функции refreshTokenInterval и getCookie, указанные ниже. Два других блока кода предназначены для справки, поскольку они вызываются, но раньше они работали нормально.

export function refreshTokenInterval() {
  setInterval(() => {
    postData('http://localhost:3000/token',
      { refreshToken: getCookie('refreshJwt') })
      .then(() => {})
      .catch((error) => {
        console.log(error.message);
        window.alert('Token is no longer valid, please login again.');
        window.location.replace('/index.html');
      });
  });
}
export function postData(url, data = {}) {
  return fetch(url, {
    method: 'POST',
    mode: 'cors',
    cache: 'no-cache',
    credentials: 'include', // needed for cookies
    headers: {
      'Content-Type': 'application/json',
    },
    redirect: 'follow',
    body: JSON.stringify(data),
  }).then((response) => response.json());
}

Этот метод в основном захватывает строку всех файлов cookie из document, разделяет их by ;, удаляет лишние пробелы в начале строк, а затем проверяет, совпадает ли конкретный cook ie, который мы ищем, с тем, который мы ищем (в данном случае refreshJwt). Если он совпадает, он возвращается. Если нет, повар ie продолжает искать и отвечает '', если ничего не может найти.

export function getCookie(cname) {
  const name = `${cname}=`;
  const decodedCookie = decodeURIComponent(document.cookie);
  const ca = decodedCookie.split(';');
  for (let i = 0; i < ca.length; i += 1) {
    let c = ca[i];
    while (c.charAt(0) === ' ') {
      c = c.substring(1);
    }
    if (c.indexOf(name) === 0) {
      console.log(c.substring(name.length, c.length));
      return c.substring(name.length, c.length);
    }
  }
  return '';
}

Для справки, я также отправлю код, который будет загружен в postData приведенная выше функция:

router.post('/token', (request, response) => {
  const { refreshToken } = request.body;
  if (refreshToken in tokenList) {
    const body = {
      email: tokenList[refreshToken].email,
      _id: tokenList[refreshToken]._id,
      name: tokenList[refreshToken].name,
    };
    const token = jwt.sign({ user: body }, process.env.JWT_SECRET, { expiresIn: 300 });

    // update jwt
    response.cookie('jwt', token);
    tokenList[refreshToken].token = token;

    response.status(200).json({ token, status: 200 });
  } else {
    response.status(401).json({ message: 'unauthorized', status: 401 });
  }
});

Мое понимание кода

  1. refreshTokenInterval() вызывается один раз, когда пользователь успешно входит в игру. (не показано)
  2. Функция postData работает бесконечно внутри функции setInterval (). Его задача - использовать метод getCookie, чтобы получить текущий токен refreshToken пользователя ie, а затем использовать этот токен и URL-адрес http://localhost:3000/token для выполнения выборки для логики в конечной точке /token.
  3. При получении конечная точка /token принимает refreshToken и сопоставляет его с токеном tokenList. Оттуда функция создает объект body, используя информацию, найденную в tokenList. Новый токен подписывается, и старый refreshToken заменяется новым (годным еще на 300 мс?)
  4. Конечная точка /token затем возвращает код состояния 200, который возвращается в refreshTokenInterval функция, в которой весь процесс повторяется.

Я неправильно понимаю код?

Мой вопрос

refreshTokenInterval кажется бесконечным количество раз, очень быстро (поскольку значение не установлено, я думаю, что значение по умолчанию - 10 мс). Он работает так быстро и отправляет столько POST-запросов на сервер, что я получаю сообщение net::ERR_INSUFFICIENT_RESOURCES, и код перестает работать. Как мне изменить этот код более эффективным способом? Видите ли вы какие-либо ошибки, которые я делаю, которые могут способствовать возникновению этой ошибки?

Что я пробовал

  • Я ожидал следующих классов в этом руководстве , и когда я запускаю код, я получаю ту же ошибку. Это как если бы изменения в JavaScript или Phaser произошли с тех пор, как был написан учебный код, из-за которого он не работает. Это отлично работает для инструктора в видео, который сообщает мне, что мой код или настройка не работают.
  • Я изменил интервал setInterval на 1000 мс, что замедляет процесс, но в конечном итоге приводит к краху sh.

Что можно попробовать дальше?

...