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

Discord.js accept命令运行后无法向用户发送DM消息问题求助

问题原因

  • 异步方法未处理:message.channel.bulkDelete()、channel.send()、user.send()都是异步返回Promise的方法,你没有用await等待执行完成,也没有加.catch捕获错误,一旦操作失败(比如bulkDelete参数错误、用户关闭了陌生人私信、机器人无发送权限)就会抛出未捕获异常,直接终止代码执行,不会返回任何提示。
    额外注意:discord.js中bulkDelete仅支持批量删除2条及以上、且发送时间在14天以内的消息,你传参数1本身就会触发报错,单条消息删除直接用message.delete()即可。
  • 变量未声明:mentiondm、mentionMessage都没有用let/const声明,严格模式下会直接抛出引用错误终止执行。
  • 命令内容截取逻辑错误:你的命令名为accept,长度为6,message.content.slice(3)只会切掉前3个字符,剩下的内容会包含命令残留的cept前缀,不是你要发送的正文内容。
  • 角色匹配校验可能不生效:你是严格匹配角色名Owner的大小写和完全文本,如果你服务器内的对应角色名大小写不符、或者存在空格/其他字符,校验会直接触发返回,但因为前面的异步操作已经报错,所以错误提示也无法正常发送。

修复后代码

const fs = require('fs');
module.exports = {
  name: 'accept',
  description: 'Accept',
  // 给execute方法加async修饰,支持await
  async execute(message, args) {
    try {
      // 声明变量,单条消息删除用delete方法
      const mentiondm = message.mentions.users.first();
      await message.delete();

      if (!message.member.roles.cache.some(role => role.name === 'Owner')) {
        return await message.channel.send('Beep Boing: This command is way too powerful for you to use!');
      }
      if (!mentiondm) {
        return await message.reply('Beep Boing: No user to send message to!');
      }
      // 正确截取内容:切掉命令名长度+1个前缀空格,移除@提及标记
      const mentionMessage = message.content.slice(this.name.length + 1).replace(/<@!?\d+>/, '').trim();
      await mentiondm.send(mentionMessage);
      console.log('Message Sent!');
    } catch (err) {
      // 捕获所有错误打印,方便排查
      console.error('命令执行出错:', err);
      await message.channel.send('操作执行失败,请检查权限或目标用户是否允许接收陌生人私信').catch(e => console.error('发送错误提示失败:', e));
    }
  },
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:06:09