Discord.js开发snipe命令报Cannot read properties of undefined错误
Discord.js snipe命令报错
Cannot read properties of undefined (reading 'get')修复 运行snipe命令时报错,其余功能正常,messageDelete事件可正常触发。报错核心原因是命令执行时client.snipes为undefined,无法调用.get()方法,由两个问题导致:
- 自定义Collection初始化时序问题:当前入口文件中先加载事件处理器,再初始化
client.snipes,如果命令/事件加载逻辑存在异步时序差,会导致部分场景下访问client.snipes时属性还未挂载。 - messageDelete事件存在属性书写错误:判断消息作者是否为机器人时误用了不存在的
.client属性,实际应为.bot属性。
1. 调整入口文件初始化顺序
将client.snipes的初始化移动到创建client实例后、加载所有事件/命令逻辑之前,确保任何场景下访问client时都已经挂载了snipes属性。修正后的index.js代码:
const path = require('path') const fs = require('fs') const { Client, Intents, Collection } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, // 如需接收未缓存的消息删除事件,可额外开启MESSAGE_CONTENT权限 // Intents.FLAGS.MESSAGE_CONTENT ], // 如需接收未缓存的消息删除事件,添加下面的partials配置 // partials: ['MESSAGE', 'CHANNEL'] }); const config = require('./config.json'); // 最先初始化自定义属性,避免时序问题 client.snipes = new Collection() // 再加载事件、命令逻辑 require('./util/loadEvents')(client); // 补充你自己的命令加载逻辑,例如 require('./util/loadCommands')(client) client.login(config.token)
2. 修复messageDelete事件的属性错误
将判断机器人的.client改为.bot,避免机器人发送的消息被存入snipe,可选添加partial消息过滤逻辑,修正后的messageDelete.js代码:
module.exports = async (client,message) => { // 过滤未缓存的不完整消息,如需获取可调用message.fetch()拉取完整内容 if (message.partial) return; // 修复机器人判断属性,机器人发送的消息直接忽略 if(message.author.bot) return; client.snipes.set(message.channel.id, { content: message.content, author: message.author.tag, }) }
验证说明
其余命令正常运行说明命令处理器传参顺序没有问题,完成上述两步修改后重启bot,先发送一条测试消息再删除,调用snipe命令即可正常获取删除的消息内容。
内容的提问来源于stack exchange,提问作者Jagrit
相关产品推荐
相关产品推荐

