Discord.js TypeError:无法读取未定义发送到特定频道的属性“发送”

Posted

技术标签:

【中文标题】Discord.js TypeError:无法读取未定义发送到特定频道的属性“发送”【英文标题】:Discord.js TypeError: Cannot read property 'send' of undefined Sending to specific channel 【发布时间】:2020-09-07 15:40:40 【问题描述】:

我正在尝试制作一个在特定时间/日期宣布事件的不和谐机器人。 代码:

const Discord = require('discord.js');
const client = new Discord.Client();


client.on('ready', () => 
 console.log('Logged in as $client.user.tag!');
 client.channels.cache.get('id').send('test')
);
while (true)
  var today = new Date();
  var time = today.getHours();
  var day = today.getDay();
  if (day == 5) 
    if (time == 0) 
      client.channels.cache.get('id').send('event1');
    
  
  if (day = 3) 
    if (time = 15) 
      client.channels.cache.get('id').send('event2')
    
  


client.login('token');

(显然我已经更换了一些零件) 错误信息是: 类型错误:无法读取未定义的属性“发送”

而且它只在 event2 出现。它也不会发送消息“test”。

【问题讨论】:

抛出这个错误是因为cache.get('id')的结果是未定义的。 为什么它只会在event2之后抛出它? 尝试console.log(client.channels)查看输出结果,您可以从那里进行故障排除。 【参考方案1】:

您的代码中存在一些问题。您正在这里按您的日期和时间执行任务:

问题 1 - 作业

if (day = 3) 
  if (time = 15) 
    client.channels.cache.get('id').send('event2')
  

这段代码的意思是,如果 javascript 成功地将 day 设置为 3(它将),并且如果 javascript 成功地将 time 设置为 15,再次(它也将),那么它应该执行client.channels.cache.get('id').send('event2')

您需要使用双等号或三等号来检查是否相等。

这就是您的client.channels.cache.get('id').send('event2') 首先抛出错误的原因。这是实际运行的第一条这样的线路。

问题 2 - 通过 id 获取频道

您正在使用client.channels.cache.get('id') 尝试获取您想要广播到的频道。

'id'只是一个占位符,需要替换为频道id。

问题3——直接访问缓存

没有真正的理由直接访问缓存,您应该使用client.channels.fetch('id') - 再次,将 id 替换为频道 ID。

它会自动访问缓存或查询服务器,这取决于哪个更合适。

const Discord = require('discord.js');
const client = new Discord.Client();

client.on('ready', () => 
 console.log('Logged in as $client.user.tag!');
 client.channels.fetch('id').send('test')
);
while (true)
  var today = new Date();
  var time = today.getHours();
  var day = today.getDay();
  if (day == 5) 
    if (time == 0) 
      client.channels.fetch('id').send('event1');
    
  
  if (day == 3) 
    if (time == 15) 
      client.channels.fetch('id').send('event2')
    
  


client.login('token');

专家补充

您的代码还有一些其他问题(while(true) 循环将继续循环,即使它仅在 99.9% 的时间检查时间)。我建议搜索人们用来使用 discord.js 实现基于时间的任务的其他模式。

【讨论】:

现在它抛出 TypeError: client.channels.fetch(...).send is not a function (谢谢你的其他事情!) 因此,有相当大的错误区域会破坏您的代码。您的client.channels.fetch('id').send() 调用在检查客户端是否成功登录之外被调用。如果您强制您的条件之一为真,代码将尝试在客户端登录之前发送消息。跨度>

以上是关于Discord.js TypeError:无法读取未定义发送到特定频道的属性“发送”的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法读取未定义的“获取”函数(discord.js)

Discord.js:TypeError:无法读取未定义的属性“删除”

(Discord.js)TypeError:无法读取未定义的属性“添加”

Discord.js:TypeError:无法读取未定义的属性“get”

discord.js TypeError:无法读取未定义的属性“发送”

node.js/discord.js:TypeError:无法读取 null 的属性“setPresence”