discord.js实现服务器自定义前缀报错Cannot read property 'prefix' of null如何解决
错误产生原因
- 核心触发原因:执行
commandPrefixSchema.findOne({_id: guildId})数据库查询时,如果对应Discord服务器没有预先存储过前缀配置,查询结果会返回null,此时直接访问result.prefix就会触发该类型错误。 - 你贴出的代码中已经使用了
result?.prefix可选链语法做兜底,如果运行时仍报该错误,有两种可能:- 实际运行的代码和你贴出的代码不一致,运行版本没有添加可选链语法
- 你的Node.js版本低于14.0.0,不支持ES2020引入的可选链操作符
- 额外逻辑问题:你将
guildPrefixes定义在for循环内部,每次循环都会重置该对象,最终无法保存所有服务器的前缀配置,后续功能调用也会取不到对应前缀。
修复方案
- 第一步:兼容低版本Node.js的空值处理,替换赋值行避免直接访问null的属性:
// 替换原来的赋值行即可适配所有Node.js 10+版本 guildPrefixes[guildId] = result && result.prefix ? result.prefix : dprefix
- 第二步:调整
guildPrefixes的定义位置,挂载到client对象上方便其他业务模块调用,修复后完整代码如下:
module.exports.loadPrefixes = async (client) => { // 前缀对象移到循环外,挂载到client全局可用 client.guildPrefixes = {} await mongo().then(async (mongoose) => { try { for (const guild of client.guilds.cache) { const guildId = guild[1].id const result = await commandPrefixSchema.findOne({_id: guildId}) client.guildPrefixes[guildId] = result && result.prefix ? result.prefix : dprefix console.log(result) } console.log('[INFO] Prefixes have been loaded') } finally { mongoose.connection.close() } }) }
- 可选优化:如果服务器数量较多,可以一次性查询所有已存储的前缀配置,无需逐个服务器查询,能够明显提升机器人启动速度。
内容的提问来源于stack exchange,提问作者CrossTR15_YT
相关产品推荐
相关产品推荐

