mongodb Javascript函数返回true/false返回未定义

vjhs03f7  于 2022-12-18  发布在  Go
关注(0)|答案(3)|浏览(208)

我现在的函数有一个问题,我用MongoDB数据库来检查数据是否存在,如你所见,如果数据值为真,我想把函数的返回值设为假,如果数据值为错,它应该返回假。
一切工作到这一点。函数只是返回“未定义”。我尝试了一切我能想到的,并测试了至少一个小时,但没有找到任何解决方案。
我希望你们中的任何人可以帮助我在这里返回一个真或假。谢谢你的帮助:D

**注意:**以前也尝试过异步,但没有成功

function CheckActiveGamesPlayer1(memberid) {
            console.log("3")
            db.findOne({ GuildID: guild.id, Player1: memberid }, async(err, data) => {
                if (data.Ingame === true) {
                    console.log("4")
                    Embed.setDescription(`<@${memberid}> is in an active game. Can't start the game!`).setColor("RANDOM");
                    channel.send({ embeds: [Embed], ephemeral: true })
                    return false;
                } else {
                    console.log("5")
                    return true;
                }

            })

        }
wyyhbhjk

wyyhbhjk1#

这是因为在CheckActiveGamesPlayer1中实际上没有返回任何东西,但是在db.findOne回调中返回了一些东西。
我不确定您是如何调用CheckActiveGamesPlayer1函数的,但我建议返回一个Promise,这样您就可以通过await.then来获得您所需的响应。

function CheckActiveGamesPlayer1(memberid) {
  console.log('3');
  return new Promise( (resolve, reject) => {
    db.findOne({ GuildID: guild.id, Player1: memberid }, async (err, data) => {
      if (data.Ingame === true) {
        console.log('4');
        Embed.setDescription(`<@${memberid}> is in an active game. Can't start the game!`).setColor('RANDOM');
        channel.send({ embeds: [Embed], ephemeral: true });
        resolve(false);
      } else {
        console.log('5');
        resolve(true);
      }
    });
  });
}

然后可以调用函数并通过.then获得响应
IE:

CheckActiveGamesPlayers1(1).then( result => console.log(result) );

您也可以将async添加到CheckActivePlayers1函数中,这样您就可以等待它了。
IE:

async function CheckActiveGamesPlayer1(memberid) { ... }
const result = await CheckActiveGamesPlayers1(1);


我不确定你使用的是哪个版本的mongo,但是你可以返回db.findOne,只要它返回一个承诺,你目前使用db.findOne的方式是回调的形式,所以如果你走这条路,会有一些代码重新排列。
https://www.mongodb.com/docs/drivers/node/current/usage-examples/findOne/

yb3bgrhw

yb3bgrhw2#

尝试类似这样的操作。db。findOne可能返回一个promise,因此您可以执行await db.findOne而不是提供回调,然后您可以像正常一样返回。

async function CheckActiveGamesPlayer1(memberid) {
    console.log("3")
    const data = await db.findOne({ GuildID: guild.id, Player1: memberid });
    if (data.Ingame === true) {
        console.log("4")
        Embed.setDescription(`<@${memberid}> is in an active game. Can't start the game!`).setColor("RANDOM");
        channel.send({ embeds: [Embed], ephemeral: true })
        return false;
    } else {
        console.log("5")
        return true;
    }
}
waxmsbnn

waxmsbnn3#

这不是一个异步函数。你的函数先运行,返回undefined。然后,异步回调被调用,但是那个值没有传递给任何东西。
解决这个问题的一个方法是将其设置为异步函数,然后使用“await”关键字。

相关问题