You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:55:35