Discord.js Collection报错:TypeError: 无法读取undefined的get属性
问题定位与解决方案
报错TypeError: Cannot read properties of undefined (reading 'get')的核心原因是:在interactionHandler.js中调用client.originalAuthors时,该属性未被正确挂载到当前使用的client实例上,可能是实例不一致或初始化时机错误导致的。以下是针对性的解决步骤:
方案1:使用交互对象自带的client实例(推荐)
Discord.js的交互对象(如ButtonInteraction)本身持有机器人的全局client实例,直接从交互对象中获取,可彻底避免实例不一致问题:
// interactionHandler.js module.exports = { async handleButtonInteraction(interaction) { // 从交互对象中获取正确的client实例 const targetAuthor = interaction.client.originalAuthors.get(messageId); // 后续恢复消息的逻辑... } };
方案2:确保client实例的导出与导入一致
如果需要手动导入client,必须保证导入的是index.js中初始化的同一个实例:
- 在
index.js中导出client:
// index.js const { Client, Collection } = require('discord.js'); const client = new Client({ intents: [...] }); // 先初始化Collection client.originalAuthors = new Collection(); // 导出全局client实例 module.exports = client;
- 在
interactionHandler.js中正确导入(注意路径匹配你的文件结构):
// interactionHandler.js // 若interactionHandler在子文件夹中,路径需调整为../index.js const client = require('./index.js'); // 调用Collection方法 const targetAuthor = client.originalAuthors.get(messageId);
方案3:调整初始化与模块加载顺序
确保client.originalAuthors的初始化早于其他模块的加载,避免模块加载时client还未挂载该属性:
// index.js const { Client, Collection } = require('discord.js'); const client = new Client({ intents: [...] }); // 第一步:初始化Collection client.originalAuthors = new Collection(); // 第二步:加载其他业务模块 const msgDel = require('./msgDel.js'); const interactionHandler = require('./interactionHandler.js'); // 最后启动机器人 client.login('你的机器人Token');
调试技巧
可在interactionHandler.js中添加日志,快速定位问题:
// interactionHandler.js console.log('当前client实例的属性:', Object.keys(client)); console.log('originalAuthors是否存在:', !!client.originalAuthors);
若打印结果中没有originalAuthors,说明当前使用的client实例不是index.js中初始化的那个,需检查导入或实例获取方式。
内容的提问来源于stack exchange,提问作者toolazy
相关产品推荐
相关产品推荐

