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

Discord.js 函数内调用消息发送方法失效问题求助

问题分析与解决方案

我一眼就看出问题出在你的directMessage函数实现上!

核心问题

你的directMessage函数里嵌套了client.on('ready')事件监听器——这个事件只会在Discord机器人完成启动、首次就绪时触发一次。当你在symPriceChecker的if语句里调用directMessage时,机器人早就处于ready状态了,所以这个监听器里的client.users.fetch(...)和user.send(...)代码根本不会被执行。而你在主函数里调用时刚好赶在ready事件触发前后,所以碰巧生效了。

修复方案

把directMessage里的ready事件监听去掉,直接实现消息发送逻辑就好。同时建议加上错误处理,避免因为用户不存在、无法发送私信等情况导致代码报错。

修改后的directMessage函数和完整示例代码如下:

// 修改后的directMessage方法定义
module.exports = (client, message, discordUser) => {
  // 直接获取用户并发送消息,无需等待ready事件
  client.users.fetch(discordUser)
    .then(user => {
      return user.send(message);
    })
    .then(() => {
      console.log(`成功给用户 ${discordUser} 发送消息: ${message}`);
    })
    .catch(error => {
      console.error(`发送消息失败:`, error);
      // 常见错误原因:机器人和用户无共同服务器、用户关闭了私信、用户ID错误等
    });
};

function symPriceChecker(){ 
  sellStock.forEach(entry => { 
    if (parseInt(entry.Price) < symPrice){ 
      directMessage(client, 'Hello from if', ID); // 现在应该能正常工作了
      console.log('inside if'); 
      // 注意:用forEach遍历的时候直接pop(entry)可能会导致遍历异常,建议改用filter创建新数组
      // sellStock = sellStock.filter(item => item !== entry);
    } 
  }); 
  repeater2 = setTimeout(symPriceChecker, 5000); 
}; 

directMessage(client, 'Hello from main', ID); // 依然正常工作

额外注意事项

  • 确保ID变量是正确的Discord用户ID(数字字符串),不要写错。
  • Discord机器人只能给和自己有共同服务器的用户发私信,或者用户曾经主动给机器人发过消息,否则会发送失败,记得查看控制台的错误信息排查问题。
  • 另外,在forEach里使用sellStock.pop(entry)可能会导致遍历不完整,建议改用filter方法生成新的数组来移除元素,我在代码里加了注释提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:53:15