使用异步 - 使用 socket.io nodejs 等待

use async - await with socket.io nodejs

我正在使用 nodejs socket.io 和 angular 开发 Web 应用程序 9. 在我的后端代码中,我在 socket.connect.service 中编写了套接字。 下面是我正在使用的套接字

socket.on('request-to-sit-on-the-table', async function (data, callback) { //Previously Register
    let table = persistence.getTable(tableToken);
    if (typeof table === 'undefined') {
        let errMsg = 'This table does not exists or already closed.'
        callback(prepareResponse({}, errMsg, new Error(errMsg)));
        return;
    }
    //TODO: Get the displayName from the token.
    let guest = await guestUserService.getGuestUserByPlayerToken(JSON.parse(data.userToken));***//Here is the issue***
    // let displayName = 'DisplayName-' + guest;
    let displayName = 'DisplayName-' + Math.random();

    //TODO: Check whether the seat is available

    // If the new screen name is not an empty string
    let isPlayerInCurrentTable = persistence.isPlayerInCurrentTable(tableToken, userToken);
    if (displayName && !isPlayerInCurrentTable) {
        var nameExists = false;
        let currentPlayersTokenArr = persistence.getTableObjectPlayersToken(table)
        for (var token in currentPlayersTokenArr) {
            let gamePlayer = persistence.getPlayerPlayer(currentPlayersTokenArr[token])
            if (typeof gamePlayer !== "undefined" && gamePlayer.public.name === displayName) {
                nameExists = true;
                break;
            }
        }
        if (!nameExists) {
            //Emit event to inform the admin for requesting to sit on the table.
            let ownerToken = persistence.getTableObjectOwnerToken(table);
            let ownerSocket = persistence.getPlayerSocket(ownerToken);
            ownerSocket.emit('requested-to-sit', {
                seat: data.seat,
                secondaryUserToken: userToken,
                displayName,
                numberOfChips: envConfig.defaultNumberOfChips
            });
            callback(prepareResponse({userToken}, 'Player connected successfully.'));
        } else {
            callback(prepareResponse({}, 'This name is already taken'));
        }
    } else {
        callback(prepareResponse({}, 'This user has already joined to a game. Try clear caching'));
    }

});

在我的代码中,我从 guest.user.service 中的另一个代码获取数据。但我不确定“客人”的价值 以下是我在guest.user.service

中使用的方法
exports.findById = (id) => {
    return new Promise(function(resolve, reject) {
        guestUserModel.findById(id, (err, data) =>{
            if(err){
                reject(err);
            } else {
                resolve(data);
            }
        });
    });
};
exports.getGuestUserByPlayerToken = (playerToken) => {
    var player = playerService.findOne({ token: playerToken })
        .then(function (data) {
            return self.findById(data.guestUser._id.toString());
        })
        .then(function (guestUser) {
            return guestUser.displayName;
        })
        .catch(function (err) {
            throw new Error(err);
        })
};

虽然我得到了 return 值的 displayName 它没有传递给我的 socket.Is 中的“访客”,但在我使用 [=24= 时获取数据时存在任何语法问题] 帮助


exports.getGuestUserByPlayerToken = async playerToken => {
   try {
     let player = await playerService.findOne({token:playerToken});
     return playerService.findById(player.guestUser._id)
   } catch(error) {
     console.log(error);
     return null;
   }
};

这只是处理等待承诺未返回的错误。您需要在调用方处理它。