You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:09:01