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

MongoDB+Discord.js v14:创建用户文档后entry.mute报错求助

问题分析与解决

你遇到的错误TypeError: Cannot read properties of null (reading 'mute'),核心原因是:当创建新文档后,没有将新创建的文档赋值给entry变量,导致后续代码里的entry依然是初始的null状态。

错误代码逻辑拆解

当!entry成立时,你创建了新的infractions文档,但仅仅执行了document.save(),并没有把document赋值给entry。所以跳出if块后,entry还是原来的null,此时执行entry.mute +=1就会触发读取null属性的错误。

修复方案

有两种简洁的修复方式:

方案一:创建文档后赋值给entry

if (!entry) {
    // 创建文档后赋值给entry
    entry = await new infractions({ userID: user.id, guildID: interaction.guild.id, mute: 0 })
    console.log('member didnt have an entry so one was created')
    await entry.save() // 建议加上await确保保存完成
}
entry.mute += 1
await entry.save(); // 同样建议加await

方案二:将后续操作放到else分支(避免空值访问)

if (!entry) {
    let document = await new infractions({ userID: user.id, guildID: interaction.guild.id, mute: 0 })
    console.log('member didnt have an entry so one was created')
    await document.save()
} else {
    // 仅当entry存在时才执行累加和保存
    entry.mute += 1
    await entry.save();
}

额外建议

  • 数据库操作(save())是异步的,建议加上await确保操作完成后再执行后续代码,避免出现数据不一致的问题。
  • 可以考虑使用findOneAndUpdate这类原子操作,既能避免竞态问题,也能简化代码逻辑:
const entry = await infractions.findOneAndUpdate(
    { userID: user.id, guildID: interaction.guild.id },
    { $inc: { mute: 1 } },
    { upsert: true, new: true } // upsert: 不存在则创建;new: 返回更新后的文档
)
console.log(entry.mute) // 直接获取更新后的值

内容的提问来源于stack exchange,提问作者average discord bot maker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 13:29:54