无法读取未定义的属性“发送”: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 无法读取未定义的属性“发送”

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

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

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

无法读取未定义的属性“成员”(discord.js)

Node.js + Discord.js:无法读取未定义的属性“类”