亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法讀取未定義的屬性“發送”:Discord 機器人創建頻道并向其發送消息然后對其做出反應

無法讀取未定義的屬性“發送”:Discord 機器人創建頻道并向其發送消息然后對其做出反應

慕桂英3389331 2022-11-27 16:12:44
我正在嘗試制作一個機器人,它將嵌入的消息發送到一個頻道,然后對其做出反應。它發送到的頻道是由 discord 機器人創建的,所以我沒有頻道的 ID,只有簡單的名稱island-info-\<user ID>。該頻道在您運行命令時創建,/channel但很快會在您加入服務器時更改為并在您離開時刪除。當我運行這段代碼時:else if (cmd === `${prefix}channel`){    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這是因為 line message.guild.channels.cache.find(r => r.name === name).send(Embed)。有沒有更好的方法來做到這一點,因為當我取出cache零件時,它說find這不是命令。謝謝?。ň庉嫞┪蚁嘈胚@是因為它在創建頻道的同時或之前將消息發送到頻道,出于我不知道的原因,有沒有人知道解決這個問題的方法,因為當我在之后訪問頻道時最后}一切正常
查看完整描述

2 回答

?
慕碼人2483693

TA貢獻1860條經驗 獲得超9個贊

在您嘗試向其發送消息時,該頻道不存在。


您正在使用.then(),.catch()因此您必須對承諾有一定的了解。請記住,promise 表示的操作不會在任何地方完成,除了在 promise 回調內部(或在您使用 之后await)。


基本上你是這樣寫的:


//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);

您發送消息的代碼取決于已經創建的頻道。因此,它需要在承諾的.then()回調中。channels.create(...)這還有一個額外的好處,即 promise 將實際解析通道對象,因此您可以調用.send()它而不需要搜索緩存。


message.guild.channels.create(name, {...}).then(chan => {

  //make embed

  chan.send(Embed);

}).catch(console.error);

您將需要類似地附加 a.then()到.send()呼叫以對剛剛發送的消息做出反應。因為您需要等待 Discord 真正發出消息,然后才能對其做出反應。


查看完整回答
反對 回復 2022-11-27
?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

如果未定義,則意味著您需要的具有該名稱的頻道不存在。我不知道在你的情況下你會如何處理這個,但這是一個選擇:


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 命名你的頻道,因為這些永遠不會改變


查看完整回答
反對 回復 2022-11-27
  • 2 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號