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
相关产品推荐
相关产品推荐

