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...
问题分析与修复
- 错误根源:报错指向
index.js第51行,说明崩溃并非来自DM命令代码,而是主文件中messageCreate事件的处理逻辑里,尝试读取一个null对象的id属性。 - DM命令代码优化:命令内存在冗余逻辑,可简化为:
加上// 替换原命令中发送DM的部分 if(message.member.roles.cache.has('1267019315337760810')){ await user.send(msg); // user已是GuildMember对象,直接调用send即可 message.channel.send('sent'); }await确保异步操作完成,避免潜在的Promise未处理问题。 - 主文件错误修复:
- 打开
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
相关产品推荐
相关产品推荐

