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

Discord.js机器人发送DM后立即崩溃问题求助

Discord机器人DM命令执行后崩溃问题

我用discord.js开发的Discord机器人,执行DM命令时能成功发送私信并在频道回复“sent”,但终端随即崩溃。尝试多种修复方法后,未在谷歌找到同类问题案例。

命令代码

module.exports = {
    name: "dm",
    description: "DMs a user a message",
    async execute(message, args, Discord){

        const user = message.mentions.members.first();
        const msg = args.slice(1).join(" ");

        if (!user) return message.channel.send('you must ping whoever you want to send the dm to');
        if (!msg) return message.channel.send("no message was written to send");

        try {
            if(message.member.roles.cache.has('1267019315337760810')){
                if(user){
                    const memberTargter = message.guild.members.cache.get(user.id);
                    memberTargter.send(msg);
                    message.channel.send('sent');
                }
            } else{
                message.channel.send('you dont have permission to do that')
            }
        } catch (error){
            console.log(error)
        }
    }
}

预期与实际结果

  • 预期:机器人无故障完成DM发送
  • 实际:发送成功后终端崩溃,报错信息如下:
node:events:497
      throw er; // Unhandled 'error' event
      ^

TypeError: Cannot read properties of null (reading 'id')
    at Client.<anonymous> (C:\Users\EL HAMD\Desktop\fire-department-bot\index.js:51:55)
    at Client.emit (node:events:531:35)
    at MessageCreateAction.handle (C:\Users\EL HAMD\Desktop\fire-department-bot\node_modules\discord.js\src\client\actions\MessageCreate.js:28:14)
    at module.exports [as MESSAGE_CREATE] (C:\Users\EL HAMD\Desktop\fire-department-bot\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (C:\Users\EL HAMD\Desktop\fire-department-bot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:355:31)    
    at WebSocketManager.<anonymous> (C:\Users\EL HAMD\Desktop\fire-department-bot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:239:12)     
    at WebSocketManager.emit (C:\Users\EL HAMD\Desktop\fire-department-bot\node_modules\@vladfrangu\async_event_emitter\dist\index.cjs:287:31)
    at WebSocketShard.<anonymous> (C:\Users\EL HAMD\Desktop\fire-department-bot\node_modules\@discordjs\ws\dist\index.js:1190:51)
    at WebSocketShard.emit (C:\Users\EL HAMD\Desktop\fire-department-bot\node_modules\@vladfrangu\async_event_emitter\dist\index.cjs:287:31)
    at WebSocketShard.onMessage (C:\Users\EL HAMD\Desktop\fire-department-bot\node_modules\@discordjs\ws\dist\index.js:1005:14)
Emitted 'error' event on Client instance at:
    at emitUnhandledRejectionOrErr (node:events:402:10)
    at process.processTicksAndRejections (node:internal/process/task_queues:84:21)

Node.js v20.16.0
[nodemon] app crashed - waiting for file changes before starting...

问题分析与修复

  1. 错误根源:报错指向index.js第51行,说明崩溃并非来自DM命令代码,而是主文件中messageCreate事件的处理逻辑里,尝试读取一个null对象的id属性。
  2. DM命令代码优化:命令内存在冗余逻辑,可简化为:
    // 替换原命令中发送DM的部分
    if(message.member.roles.cache.has('1267019315337760810')){
        await user.send(msg); // user已是GuildMember对象,直接调用send即可
        message.channel.send('sent');
    }
    
    加上await确保异步操作完成,避免潜在的Promise未处理问题。
  3. 主文件错误修复:
    • 打开index.js第51行,检查相关代码,常见场景包括:尝试访问message.member.id但消息来自DM频道(此时message.member为null),或未正确获取对象就读取其id属性。
    • 给Client添加error事件监听,避免未处理的错误导致崩溃:
      client.on('error', (err) => {
          console.error('客户端错误:', err);
      });
      
    • 在messageCreate事件的处理逻辑外层包裹try/catch,捕获并处理异常。

内容的提问来源于stack exchange,提问作者Tuf Kourio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 03:47:32