提问者:小点点

对socket.io节点JS使用async-await


我正在使用nodejs Socket.io和angular 9开发一个web应用程序。 在我的后端代码中,我在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”的值,下面是我在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);
        })
};

虽然我得到了返回值的displayName,但它并没有传递给我的套接字中的“guest”。当我使用Promises获取数据时,是否存在任何语法问题。请帮助


共1个答案

匿名用户


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;
   }
};

这只是处理错误在等待的承诺上没有返回一个。 你需要在主叫方处理这个问题。