Discord.js DM消息日志异常:发送第二条DM时机器人崩溃
解决方案:Discord机器人记录DM时第二条崩溃的问题
我之前处理过类似的问题,你的机器人崩溃的核心原因是Discord.js的MessageEmbed.addField()方法不允许字段值为空(空字符串、null或undefined),而你没有处理msg.content为空的场景。
为什么会出现这个问题?
你觉得msg.content并非空值,但实际上在很多场景下,用户发送的DM是没有文本内容的:
- 仅发送图片、视频等附件
- 发送Discord贴纸(Sticker)
- 发送系统触发的非文本消息
你第一次发送的是正常文本DM,第二次刚好碰到了这类无文本的情况,就触发了报错。
修复后的代码
我给你调整了代码,加上了空值处理、机器人消息过滤、频道存在检查和错误捕获,彻底解决这个问题:
bot.on('message', msg => { // 跳过机器人自己的消息,避免误触发或循环 if (msg.author.bot) return; // 只处理DM频道的消息 if (msg.channel.type !== 'dm') return; // 获取日志频道,先检查是否存在 const LogChannel = bot.channels.cache.get('712811824826941460'); if (!LogChannel) { console.error('日志频道不存在,请检查频道ID是否正确'); return; } // 处理空内容的情况,给一个友好的占位符 const messageContent = msg.content || '*无文本内容(可能包含附件、贴纸或其他非文本消息)*'; // 构建日志Embed,同时加上你需要的发送者ID字段 const LogEmbed = new Discord.MessageEmbed() .setColor('#606060') .setAuthor(msg.author.tag, msg.author.displayAvatarURL()) // 加上发送者头像,日志更直观 .setDescription('收到用户DM消息') .addField('发送者ID', msg.author.id) .addField('消息内容', messageContent) .setTimestamp(); // 发送日志,同时捕获可能的发送错误,避免机器人崩溃 LogChannel.send(LogEmbed) .catch(err => console.error('发送日志失败:', err)); });
额外优化建议
- 处理附件内容:如果用户发送了附件,可以在Embed里添加附件的链接,比如:
if (msg.attachments.size > 0) { const attachmentLinks = msg.attachments.map(att => `[${att.name}](${att.url})`).join('\n'); LogEmbed.addField('附件', attachmentLinks); } - 版本兼容性:如果你使用的是Discord.js v13及以上版本,
MessageEmbed已经被替换为EmbedBuilder,需要调整导入方式:const { EmbedBuilder } = require('discord.js'); // 然后用 new EmbedBuilder() 替代 new Discord.MessageEmbed()
内容的提问来源于stack exchange,提问作者LAdams07
相关产品推荐
相关产品推荐

