Выражайте Длительный опрос, сохраняя ответы

#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. Какую базу данных вы используете? Большинство баз данных предоставляют утилиты для подключения прослушивателей к таблице/коллекции с определенным запросом. Вы можете получать изменения из базы данных без необходимости «постоянно зацикливаться на каком-либо таймере».