Socket.io NodeJS发布和发送gettin NULL

时间:2019-01-16 12:25:44

标签: node.js socket.io

所以我在这里首先要通过密码加入一些大厅:

app.post('/join-lobby', async(req, res) => {});

然后在代码下面,我声明我的套接字发出:

socket.on('join-lobby', (data) => {
    User.findOne({username: data.username}).then(async(user) => {
        if(user != null) {
            let memberofLobby = await UserLobby.findOne({username: user.username}); // RETURNS NULL
            //let lobbyId = await memberofLobby.lobby_id;
            console.log(memberofLobby);
            io.emit('join-lobby', {
                username: user.username,
                level: user.level,
                skin: user.skin,
                lobbyId: memberofLobby.lobby_id
            });
            //let lobbyId = memberofLobby.lobby_id;
        } else {
            console.log('User not found');
        }
    })
});

问题是我无法在此行同时从套接字let memberofLobby = await UserLobby.findOne({username: user.username});的DB集合中获取数据。因此它返回我NULL。

当我提交表单(输入密码)时,套接字发射会立即在表单提交时触发,我相信这就是为什么它可以从集合中获取信息。

P.S。页面刷新后完美添加了用户,因此POST(第一条路线)可以正常工作。

$( "#join-lobby" ).submit(function( event ) {
    socket.emit('join-lobby', {
        username: $("#username").text()
    });
});
-------------------------------------
app.post('/join-lobby', async(req, res) => {});
-------------------------------------
    socket.on('join-lobby', (data) => {
        User.findOne({username: data.username}).then(async(user) => {
            if(user != null) {
                let memberofLobby = await UserLobby.findOne({username: user.username}); // NULL

1 个答案:

答案 0 :(得分:0)

猫鼬文档说findOne()方法返回一个“查询”对象。 因此,在下面的行中,您尝试等待不返回promise的方法:

let memberofLobby = await UserLobby.findOne({username: user.username});

我建议在行的末尾添加.exec(),以实际执行findOne()并因此获得承诺,就像这样。

let memberofLobby = await UserLobby.findOne({username: user.username}).exec();

让我知道它是否对您有用!