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

Discord.js等待用户私信回复报错,求修复及有效实现方案

Discord机器人私信等待用户回复功能修复

错误原因

报错TypeError: Cannot read properties of null (reading 'awaitMessages')是因为用户与机器人尚未建立私信通道,author.dmChannel返回null,无法调用awaitMessages方法。此外代码还存在其他问题:

  • 未定义消息过滤器filter,无法筛选目标用户的回复
  • 错误使用interaction.first()获取回复消息,应从消息集合中取第一条
  • 缺少异步处理,创建DM通道是异步操作需等待完成

修复方案

  1. 先创建/获取用户的私信通道,避免直接使用可能为null的dmChannel
  2. 定义消息过滤器,确保只接收目标用户的消息(可按需附加附件验证逻辑)
  3. 修正消息集合的取值方式,使用collected.first()获取用户回复
  4. 将代码改为异步函数,处理异步操作

完整修复代码

// 确保所在函数为async函数
async function handleModalSubmit(interaction) {
  if (!interaction.isModalSubmit()) return;

  // 获取模态框输入数据
  const user = interaction.fields.getTextInputValue('scammerUSERInput');
  const id = interaction.fields.getTextInputValue('scammerIDInput');
  const reason = interaction.fields.getTextInputValue('reasonInput');
  console.log({ user, id, reason });

  // 在交互会话中回复用户
  await interaction.reply("<:camera:1005890593458765918> **请提供图片或视频证据,所有证据需附在同一条消息中。**");

  const author = interaction.user;
  // 创建或获取用户的私信通道
  const dmChannel = author.dmChannel || await author.createDM();

  // 定义消息过滤器:仅接收当前用户的消息,且消息包含附件(可根据需求调整)
  const filter = (msg) => {
    return msg.author.id === author.id && msg.attachments.size > 0;
  };

  try {
    // 等待用户回复
    const collected = await dmChannel.awaitMessages({
      filter,
      max: 1,
      time: 30000,
      errors: ['time']
    });

    const replyMsg = collected.first();
    // 可在此处添加证据处理逻辑,比如保存附件、记录信息等
    await dmChannel.send("证据已收到,感谢你的提交!");
  } catch (err) {
    // 处理超时或其他异常
    await dmChannel.send("超时未收到你的证据,提交已终止。");
  }
}

额外优化建议

  • 若不需要限制必须带附件,可删除filter中的msg.attachments.size > 0条件
  • 可在交互回复中补充提示用户查看私信,避免遗漏
  • 增加createDM的错误捕获,处理用户拒绝接收私信的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:24:08