无法读取未定义的属性“发送”:Discord 机器人创建通道并向其发送消息然后对其做出反应
Posted
技术标签:
【中文标题】无法读取未定义的属性“发送”:Discord 机器人创建通道并向其发送消息然后对其做出反应【英文标题】:Cannot read property 'send' of undefined: Discord bot making a channel and sending a message to it then reacting to it 【发布时间】:2020-11-10 04:42:14 【问题描述】:我正在尝试制作一个机器人,它将嵌入式消息发送到频道,然后对其做出反应。它发送到的频道是由 discord 机器人创建的,所以我没有频道的 ID,只有 island-info-\<user ID>
的名称。此频道是在您运行命令/channel
时创建的,但很快会在您加入服务器时更改为在您离开时删除。当我运行这段代码时:
else if (cmd === `$prefixchannel`)
const name = "island-info-" + message.author.username.toLowerCase();
message.guild.channels.create(name,
type: 'text',
permissionOverwrites: [
id: message.guild.id,
deny: ["VIEW_CHANNEL", "SEND_MESSAGES"]
,
id: message.author.id,
allow: ["VIEW_CHANNEL", "ADD_REACTIONS"]
,
],
parent: "734170209107051074"
)
.catch(console.error);
const Embed = new Discord.MessageEmbed()
.setTitle('ISLAND INFO')
message.guild.channels.cache.find(r => r.name === name).send(Embed)
message.guild.channels.cache.find(r => r.name === name).messages.fetch( limit: 1 ).then(messages =>
messages.first().react("????")
).catch(err =>
console.error(err)
)
它抛出错误:Cannot read property 'send' of undefined
,这是因为 message.guild.channels.cache.find(r => r.name === name).send(Embed)
行。有没有更好的方法来做到这一点,因为当我取出cache
部分时,它说find
不是命令。 谢谢!
(EDIT) 我相信这是因为它在创建频道的同时或之前将消息发送到频道,出于我不知道的原因,有人知道吗?解决这个问题,因为当我在最后一个 之后访问频道时,一切正常
【问题讨论】:
【参考方案1】:如果未定义,则表示您需要的具有该名称的频道不存在。 我不知道在您的情况下您会如何处理,但这是一个选项:
const Embed = new Discord.MessageEmbed()
.setTitle('ISLAND INFO');
const channel = message.guild.channels.cache.find(r => r.name === name);
if (!channel) message.channel.send("Your channel does not exist!");
else
channel.send(embed)
通过用户名存储数据时要注意的另一件事是用户名可以更改。我建议您按用户 ID 命名您的频道,因为这些永远不会改变
【讨论】:
问题是,当我在“.send”行中添加时,它不会创建通道,当我取出该部分时,它会使通道一切正常。我认为,出于某种原因,它在创建通道的同时发送消息,因此它还不存在。你知道解决这个问题的方法吗(即将编辑问题以添加此详细信息) @CR9GAMING gist.github.com/DiamondMiner88/a66e9016500946ee987c369567ef4697 嘿谢谢你,因为这几乎可以工作,它现在向频道发送一条消息但随后没有反应并抛出类似的错误“无法读取未定义的属性'反应'”跨度> channel.send(embed).then(message => message.react('whatever'); 天啊,非常感谢!救生员【参考方案2】:在您尝试向其发送消息时,该频道不存在。
您正在使用.then()
和.catch()
,因此您必须对承诺有一定的了解。请记住,除了在 Promise 回调内部(或者如果您使用 await
之后)之外,Promise 表示的操作未完成。
基本上你在写这个:
//send a request to Discord to make a channel
message.guild.channels.create(name, ...).catch(console.error);
...
//immediately, without waiting for Discord to make the channel, send a message to it
message.guild.channels.cache.find(r => r.name === name).send(Embed);
您发送消息的代码取决于已创建的频道。因此,它需要在channels.create(...)
承诺的.then()
回调中。这还有一个额外的好处,即 Promise 将通过通道对象实际解析,因此您可以在其上调用 .send()
而无需搜索缓存。
message.guild.channels.create(name, ...).then(chan =>
//make embed
chan.send(Embed);
).catch(console.error);
您需要类似地将.then()
附加到.send()
调用以对刚刚发送的消息作出反应。因为您需要等待 Discord 真正发出消息,然后才能对其做出反应。
【讨论】:
以上是关于无法读取未定义的属性“发送”:Discord 机器人创建通道并向其发送消息然后对其做出反应的主要内容,如果未能解决你的问题,请参考以下文章
Discord.js TypeError:无法读取未定义发送到特定频道的属性“发送”