Discord.js等待用户私信回复报错,求修复及有效实现方案
Discord机器人私信等待用户回复功能修复
错误原因
报错TypeError: Cannot read properties of null (reading 'awaitMessages')是因为用户与机器人尚未建立私信通道,author.dmChannel返回null,无法调用awaitMessages方法。此外代码还存在其他问题:
- 未定义消息过滤器
filter,无法筛选目标用户的回复 - 错误使用
interaction.first()获取回复消息,应从消息集合中取第一条 - 缺少异步处理,创建DM通道是异步操作需等待完成
修复方案
- 先创建/获取用户的私信通道,避免直接使用可能为null的
dmChannel - 定义消息过滤器,确保只接收目标用户的消息(可按需附加附件验证逻辑)
- 修正消息集合的取值方式,使用
collected.first()获取用户回复 - 将代码改为异步函数,处理异步操作
完整修复代码
// 确保所在函数为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
相关产品推荐
相关产品推荐

