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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:09:37