Предпосылки
Я слежу за крупномасштабным учебником по созданию 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 });
}
});
Мое понимание кода
refreshTokenInterval()
вызывается один раз, когда пользователь успешно входит в игру. (не показано) - Функция
postData
работает бесконечно внутри функции setInterval (). Его задача - использовать метод getCookie
, чтобы получить текущий токен refreshToken пользователя ie, а затем использовать этот токен и URL-адрес http://localhost:3000/token
для выполнения выборки для логики в конечной точке /token
. - При получении конечная точка
/token
принимает refreshToken и сопоставляет его с токеном tokenList
. Оттуда функция создает объект body
, используя информацию, найденную в tokenList
. Новый токен подписывается, и старый refreshToken заменяется новым (годным еще на 300 мс?) - Конечная точка
/token
затем возвращает код состояния 200, который возвращается в refreshTokenInterval
функция, в которой весь процесс повторяется.
Я неправильно понимаю код?
Мой вопрос
refreshTokenInterval
кажется бесконечным количество раз, очень быстро (поскольку значение не установлено, я думаю, что значение по умолчанию - 10 мс). Он работает так быстро и отправляет столько POST-запросов на сервер, что я получаю сообщение net::ERR_INSUFFICIENT_RESOURCES
, и код перестает работать. Как мне изменить этот код более эффективным способом? Видите ли вы какие-либо ошибки, которые я делаю, которые могут способствовать возникновению этой ошибки?
Что я пробовал
- Я ожидал следующих классов в этом руководстве , и когда я запускаю код, я получаю ту же ошибку. Это как если бы изменения в JavaScript или Phaser произошли с тех пор, как был написан учебный код, из-за которого он не работает. Это отлично работает для инструктора в видео, который сообщает мне, что мой код или настройка не работают.
- Я изменил интервал setInterval на 1000 мс, что замедляет процесс, но в конечном итоге приводит к краху sh.
Что можно попробовать дальше?