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
相关产品推荐
相关产品推荐

