使用Mongoose的findOne方法时返回undefined的问题排查
Mongoose findOne返回undefined的问题解决
核心问题:异步操作未等待结果
Mongoose的findOne是异步方法,直接赋值给data得到的是Promise对象,而非实际查询到的文档数据。所以直接访问data.expected、data.reason自然会返回undefined。
解决方法:添加await关键字
因为你的message事件回调已经声明为async,直接在findOne前加await即可获取实际查询结果:
const data = await holidaydata.findOne({ staff: message.author.id })
其他潜在问题修正
1. 逻辑判断错误
原代码中if (!message.guild.id === "911962044985667584")的写法有误,!的优先级高于===,会先计算!message.guild.id再和字符串比较,导致逻辑反向。正确写法:
if (message.guild.id !== "911962044985667584") return;
2. 文档删除方法错误
Mongoose文档的删除方法是deleteOne(),而非delete(),修改删除逻辑:
await data.deleteOne();
修正后的完整代码片段
client.on('message', async message => { let p = config.bot.prefix; let client = message.client; if (message.author.bot) return; if (message.channel.type === 'dm') return; if (!message.content.startsWith(p)) { console.log(1) let guild = client.guilds.cache.get(config.server.id) // 修正逻辑判断 if (message.guild.id !== "911962044985667584") return; let role = message.guild.roles.cache.find(role => role.name === "On holiday"); if (!message.member.roles.cache.has("956942754502565908")) return; const embed = new MessageEmbed() .setTitle("Staff back from holiday") .addField("Staff: ", message.author.tag, true) // 添加await获取实际数据 const data = await holidaydata.findOne({ staff: message.author.id }) console.log(data?.expected, data?.reason, Date.now()) // 可选链避免data为null时报错 if (!data) return console.log("NO DATA") if (Date.now() > data.expected) { console.log(3) message.member.roles.remove("956942754502565908") message.member.roles.add("913070918404833300") message.member.roles.add("913071151427780698") client.channels.cache.get(channels.stafflogs).send({ embed: embed }) message.channel.send("Welcome back from holiday!") // 修正删除方法 return await data.deleteOne(); } } })
额外建议
- 用
try/catch包裹异步操作,避免未捕获的Promise错误:
try { const data = await holidaydata.findOne({ staff: message.author.id }) // 后续逻辑 } catch (err) { console.error("查询数据库出错:", err) }
- 访问可能为null的文档属性时,使用可选链操作符
?.(如data?.expected),避免Cannot read properties of null报错。
内容的提问来源于stack exchange,提问作者Ansh Tyagi
相关产品推荐
相关产品推荐

