discord.js开发:机器人对自身消息加反应、编辑Embed及TypeError报错解决
报错原因排查
你遇到的
TypeError: Function.prototype.apply was called on #<Object>, which is a object and not a function报错核心来源为awaitReactions方法的参数传参错误,附加其他代码问题如下:
- 传参格式不匹配:discord.js v12版本中
awaitReactions第一个入参要求是过滤函数,第二个才是配置对象。你直接将包含filter的对象作为首个参数传入,方法内部尝试对该对象执行apply调用时触发类型错误。 - 未定义变量调用:代码中
if(emojis.first(collect.emoji) === '▶️')行的emojis变量从未声明定义,调用不存在的方法也会触发类型错误。 - 变量名冲突:发送消息回调的参数命名为
message,和外层方法入参message重名,导致作用域混乱。 - 旧版语法兼容问题:高版本discord.js发送Embed要求用
embeds: [Embed实例]格式,旧版embed: Embed实例语法已废弃。
功能实现方案
你需要的两个功能修正后完整代码如下,适配discord.js v12/v13两个主流版本:
const Discord = require('discord.js'); // 确保顶部引入discord.js module.exports = { name: 'emoji', group: 'misc', aliases: ['emoticon'], description: 'mostra ajuda.', use:'.help <comando>', async execute(message,args){ try{ // 定义过滤规则:仅触发消息的作者点▶️才生效 const filter = (reaction, user) => reaction.emoji.name === '▶️' && user.id === message.author.id; // 定义初始Embed和要切换的新Embed const ajuda = new Discord.MessageEmbed() .setColor('#0099ff') .setAuthor(`Comando por ${message.author.username}`, message.author.displayAvatarURL({dynamic: true}),message.url) .setTitle(`**Ajuda**`) .setDescription('**Modo de uso:** .help <comando> \n _Exemplo: .help config_') .addFields({name: '**configuração**', value: 'mostra comandos de.'}) .setTimestamp() .setFooter('[PRD] Corridas todos os direitos reservados.'); const newEmbed = new Discord.MessageEmbed() .setDescription('a') .setColor('#00ff99'); // 发送Embed消息,兼容高低版本语法 const botMsg = await message.channel.send({ embeds: [ajuda], // 兼容v12旧版语法,如果报错就保留下面这行、注释掉上面的embeds行 // embed: ajuda }); // 功能1:机器人给自己发送的消息加反应 await botMsg.react("▶️"); // 监听反应,适配版本传参 // --- 如果是v12版本用下面这行 --- // const collected = await botMsg.awaitReactions(filter, { max: 1, time: 60000, errors: ['time'] }); // --- 如果是v13+版本用下面这行 --- const collected = await botMsg.awaitReactions({ filter, max: 1, time: 60000, errors: ['time'] }); const reaction = collected.first(); if(reaction.emoji.name === '▶️') { // 功能2:用户点指定反应后编辑机器人的Embed消息 await botMsg.edit({ embeds: [newEmbed] }); // 可选:点完后清理所有反应 await botMsg.reactions.removeAll(); } } catch(error){ console.log(error); } } }
版本适配提示:如果运行时还是报参数错误,切换
awaitReactions的传参格式即可,90%以上的同类型报错都是版本传参不匹配导致。
内容的提问来源于stack exchange,提问作者bhaskaral7 dev
相关产品推荐
相关产品推荐

