#node.js #express #polling
Вопрос:
Я пытаюсь найти эффективный способ проведения длительного опроса в express, и у меня возникли некоторые проблемы.
Мой сценарий: Пользователи играют в пошаговую игру для двух игроков(кстати, игра Go), где состояние игры хранится в базе данных. Я хочу иметь систему, в которой игрок отправляет запрос GET для длительного опроса сервера, и чтобы сервер отвечал обновленным состоянием игры только на запрос GET, как только другой игрок отправит запрос PUT, который воспроизводит ход и обновляет состояние игры на сервере. Для этого я подумал, что мог бы сделать хранилище запросов на подвешивание.
Это было бы лучше, чем постоянно зацикливаться на каком-то таймере, чтобы проверять базу данных на наличие обновлений игры.
Вот какой-то код psuedo
//LIST OF HANGING REQUESTS
const hangingRequests = [];
route.get("/", (req, res) => {
const result = await Game.findById(req.body.gameid).exec();
let playerColor;
if (req.username === result.playerBlack) {
playerColor = "black";
} else {
playerColor = "white";
}
if (playerColor === result.turn) {
res.status(200).json({...result});
break;
} else {
hangingRequests.push({Request:{...req}, Response:{...res}})
//Basically my entire question envolves the previous line,
//does this idea of storing a hanging request for later work?
}
})
route.post("/", (req, res) => {
//logic for validating the move is valid....
if(moveIsValid){
//update gamestate in db
res.staus(200).json({gamestate})
//SERVE HANGING REQUEST
const hangingRequest = hangingRequests.find( request => request.body.gameid === req.body.gameid)
hangingRequest.Response.staus(200).json({gamestate})
} else {
res.sendStaus(400)
}
})```
However, I run into the error that hangingRequest.Response.status method is undefined and not a function. Any help?
Комментарии:
1. Какую базу данных вы используете? Большинство баз данных предоставляют утилиты для подключения прослушивателей к таблице/коллекции с определенным запросом. Вы можете получать изменения из базы данных без необходимости «постоянно зацикливаться на каком-либо таймере».