我目前有一个问题与我的功能。我使用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"字。