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

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));
});

额外优化建议

  1. 处理附件内容:如果用户发送了附件,可以在Embed里添加附件的链接,比如:
    if (msg.attachments.size > 0) {
      const attachmentLinks = msg.attachments.map(att => `[${att.name}](${att.url})`).join('\n');
      LogEmbed.addField('附件', attachmentLinks);
    }
    
  2. 版本兼容性:如果你使用的是Discord.js v13及以上版本,MessageEmbed已经被替换为EmbedBuilder,需要调整导入方式:
    const { EmbedBuilder } = require('discord.js');
    // 然后用 new EmbedBuilder() 替代 new Discord.MessageEmbed()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:12:33