【问题标题】:Why is "message.channel.find" not a function?为什么“message.channel.find”不是函数?
【发布时间】:2019-05-25 03:53:03
【问题描述】:

我正在创建一个不和谐机器人,我想为它创建一个“警告”命令,以在不和谐服务器中的用户行为不端时警告他们。但是,当我运行代码并尝试命令时,它只运行到一半,弹出未处理的承诺拒绝消息,说我还没有定义我的message.channel.find() 函数,即使我已经完全定义了它。

对于某些背景,我正在用 javascript 对这个机器人进行编码,node.js 更具体。我也在使用 discord.js 库。我尝试重新启动我的代码,重新输入括号内的内容,甚至尝试重新格式化几次。但是,这些都没有奏效。我已包含我的代码以帮助大家更好地理解我的问题。

// Here is where it starts to get shakey
let firstslice = message.content.slice(6);
let membertag = membertobewarned.tag;
let reason = firstslice.slice(membertag);
message.channel.send("Second debugging check, check!");

// Here is where it stops working, and the line below this text is where I 
// am getting unhandled promise rejection errors from.
let warnchannel = message.channel.find(`name`, "logs");
if (message.author.bot) return;
if (!message.author.hasPermission("MANAGE_MESSAGES")) return message.channel.send("Sorry, but you do not have permission to use this command.");
if (!membertobewarned.hasPermission("MANAGE_MESSAGES")) return message.channel.send("Sorry, but you cannot warn this member.");

message.channel.send("Third debugging thing, check!");

let warnembed = new Discord.RichEmbed()
  .setDescription("Warning")
  .setColor("#FFA500")
  .addField("User:", membertobewarned)
  .addField("Warned By:", commanduser)
  .addField("For Reason:", reason)
  .addField("Time:", timewarned);
warnchannel.send(warnembed);

message.channel.send("I'm all done!");

应该发生的事情是机器人将获取消息发送的渠道、警告谁、谁警告了那个人、他们的提及以及警告的原因。
然后它将获取该信息,并将其编译为不和谐 RichEmbed,然后将其发送到 #logs 频道。
但是,实际发生的情况是,当命令运行时,它会获取所有信息,然后在检查#logs 频道的地方,它会抛出错误:

UnhandledPromiseRejectionWarning TypeError: message.channel.find is not a function. 

我希望能够弄清楚为什么会出现此错误,以及如何解决它。感谢大家阅读本文,我希望你们都能尽快帮助我,并度过美好的一天。

【问题讨论】:

    标签: javascript node.js discord.js


    【解决方案1】:

    这是因为 message.channel 是一个对象,而不是数组或 Map(在 Discord.js 中称为 Collection)。

    我不太确定你想要完成什么,但是如果你想选择另一个频道,你需要使用任何一个

    message.guild.channels.find('name', 'logs')
    

    或在较新的 Discord.js 版本中

    message.guild.channels.find(channel => channel.name === 'logs')
    

    【讨论】:

    • 只是两个旁注:1) discord.js Collection 是标准 js Map 的 extension,而不是简单的调用 maps 的奇特方式。 2) 第一种使用.find() (.find('name', 'logs')) 的方式已被弃用,因此最好始终使用秒类型,在其中传递一个返回布尔值的函数。
    • 这行得通,但现在message.author.hasPermission 不是一个函数。
    • @Sbss1111 你应该看看 discord.js 文档。正如你在这里看到的discord.js.org/#/docs/main/stable/class/Message?scrollTo=author,message.author 是 User 类型,而 hasPermission 是 GuildMember 类的一个函数。 (提示:message.member 返回公会成员)
    • 感谢资源,我去看看。
    猜你喜欢
    • 2021-09-09
    • 2019-10-12
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多