Javascript函数返回true/false返回undefined



我目前有一个问题与我的功能。我使用MongoDB数据库来检查是否存在,如你所见,如果数据值为真,我想将函数的返回值设置为false,或者当它是错误的,它应该返回false。

到目前为止一切正常。函数只是返回"未定义"。我试了我能想到的所有方法,测试了至少一个小时,但还是没有找到任何解决方案。

我希望你们中的任何一个人可以帮助我在这里返回一个真或假。谢谢你的帮助:D

注意:也尝试过async之前,没有工作

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

这是因为您实际上没有在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/

试试这样做。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;
}
}

这不是一个异步函数。你的函数先运行,返回undefined。然后,调用异步回调,但该值没有传递给任何值。

解决这个问题的一种方法是将this设置为async函数,然后使用"await"字。

最新更新