我正在构建一个Discord机器人,它在运行命令时会创建一个私有线程,并将运行该命令的用户添加到该线程。我遇到了一个问题,即线程已成功创建,但在尝试将成员添加到线程时,出现错误。
我的代码如下:
const { SlashCommandBuilder, EmbedBuilder } = require('discord.js')
module.exports = {
data: new SlashCommandBuilder()
.setName('pthread')
.setDescription('Create private thread'),
async execute(interaction) {
const channel = interaction.channel
const user = interaction.user
const userName = user.username
const threadName = userName + "'s-Private-Thread"
// Create a new private thread
channel.threads
.create({
name: threadName,
autoArchiveDuration: 60,
type: 12,
reason: 'na',
})
.then(threadChannel => console.log(threadChannel))
.catch(console.error);
var thread = channel.threads.cache.find(x => x.name === threadName)
await thread.members.add(user)
await interaction.reply({ content: 'A private thread has been created for you!', ephemeral: true })
}
}
下面是我得到的错误:
TypeError: Cannot read properties of undefined (reading 'members')
at Object.execute (C:\Users\Liam\Desktop\Files\Code\GitHubRepos\ThreadMaker\commands\addEntry.js:27:18)
如果我尝试使用
await thread.send({ content: 'Hello' })
具体而言,
TypeError: Cannot read properties of undefined (reading 'send')
at Object.execute (C:\Users\Liam\Desktop\Files\Code\GitHubRepos\ThreadMaker\commands\addEntry.js:27:18)
如果我运行这个命令两次,它确实成功地将用户添加到线程中/在线程中发送消息,但随后创建了一个重复的线程。这几乎就像命令需要在我能够对线程做任何事情之前完成执行一样。我唯一的理论是在命令完成执行之前线程没有保存到缓存中。如果是这种情况,我可以强制它在执行过程中保存到缓存中吗?谢谢
1条答案
按热度按时间laik7k3q1#
我不知道你为什么把
then()
方法和async
/await
混合在一起。可能这就是你认为该高速缓存已经更新的原因。然而,在你的代码中,channel.threads.cache.find()
在channel.threads.create()
完成创建你的线程之前运行(因为承诺不会阻止事件循环)。channel.threads.create()
返回一个promise,一旦它被解析,就返回创建的ThreadChannel
。这意味着你可以获取创建的频道。您还应该使用枚举(如
ChannelType.GuildPrivateThread
)而不是幻数(12
)。