我试图通过其ID获得服务器上的特定消息内容,但不知道确切的通道。这是我使用的代码:
message.guild.channels.cache.filter(c => c.type === 'GUILD_TEXT').each((c) => {
console.log(c.messages.cache.get("ID").content)
})
但最后我得到的唯一的东西是:
TypeError: Cannot read properties of undefined (reading 'content')
如果有人能帮我找到更优的方法来做这件事或修复我的,我将非常感激!
这是我发现的工作…
message.guild.channels.cache.filter(c => c.type === 'GUILD_TEXT').each(async c => {
let getMsg = async () => {
let msg = await c.messages.fetch(/* ID HERE */).catch(err => err)
return msg
}
getMsg().then(msg => {
if(msg.content !== undefined){
console.log(msg.content)
message.reply(`
Content: **${msg.content}**nn
Author: **<@${msg.author.id}>**nn
Channel: **<#${msg.channel.id}>**
`)
}
})
})
这是如何工作的…
问题…
你试图在非常快的时间内解析大量数据,比discord的api要快得多。因此,我创建了一个async函数,以使discord允许您以无错误的速度返回消息。
getMsg ()函数…
在
getMsg()
函数内部,Iawaited
afetch
到所有通道。最后的.catch()
函数是至关重要的,否则它将以错误代码结束您的进程。
调用函数…
然后我调用该函数并等待它完成,然后检查它得到的
message.content
是否为undefined
,因为出于一些奇怪的原因,如果我不这样做,它会抛出错误,我相信这是因为它试图记录每个通道返回的消息,而不是每个通道都能够获取它,从而导致错误。
额外…
我还添加了它来回复您的消息内容,作者和通道,以及只是为了让您了解您可以使用返回的消息访问什么,但是如果您不想这样做,则很容易删除。
没有令人惊讶的优化,但它做了你想要的:)
处理.get()
返回undefined的可能性,使用条件链接或可选链接。
message.guild.channels.cache.filter(c => c.type === 'GUILD_TEXT').each((c) => {
console.log(c.messages.cache.get("ID")?.content)
// Or
if (c.messages.cache.get("ID")) {
console.log(c.messages.cache.get("ID").content);
}
})
我推荐另一种方法。为了使代码更具可读性,请使用一些变量,然后使用find()
方法。
const textChannel = message.guild.channels.cache
.filter(c => c.type === 'GUILD_TEXT')
.find(c => c.messages.cache.has('ID'));
if (!textChannel) return console.log("No result");
const msg = textChannel.messages.cache.get('ID');
console.log(msg.content);