为啥我的 Discord 机器人在发出命令后立即崩溃?

Posted

技术标签:

【中文标题】为啥我的 Discord 机器人在发出命令后立即崩溃?【英文标题】:Why does my Discord bot immediately crash after a command?为什么我的 Discord 机器人在发出命令后立即崩溃? 【发布时间】:2021-01-11 19:20:33 【问题描述】:

我制作了一个 Discord 机器人来处理“反应角色”。用户可以对消息做出反应以获得角色。

现在,嵌入和反应已添加,但之后立即崩溃:

embedMsg.message.react('????') ^

TypeError:无法读取未定义的属性“反应” 在客户端。 (C:\Users\rdvdn\Desktop\Bot\Bot.js:19:34) 在 Client.emit (events.js:311:20) 在 MessageCreateAction.handle (C:\Users\rdvdn\Desktop\Bot\node_modules\discord.js\src\client\actions\MessageCreate.js:31:14) 在 Object.module.exports [as MESSAGE_CREATE] (C:\Users\rdvdn\Desktop\Bot\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32) 在 WebSocketManager.handlePacket (C:\Users\rdvdn\Desktop\Bot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:384:31) 在 WebSocketShard.onPacket (C:\Users\rdvdn\Desktop\Bot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:444:22) 在 WebSocketShard.onMessage (C:\Users\rdvdn\Desktop\Bot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:301:10) 在 WebSocket.onMessage (C:\Users\rdvdn\Desktop\Bot\node_modules\ws\lib\event-target.js:125:16) 在 WebSocket.emit (events.js:311:20) 在 Receiver.receiverOnMessage (C:\Users\rdvdn\Desktop\Bot\node_modules\ws\lib\websocket.js:797:20)

我认为该错误可能是由于 Discord.js 的 v12 造成的。 我不确定它为什么会崩溃,但确实添加了嵌入和反应,如果我能得到任何帮助,我将不胜感激。

我现在的代码如下:

const  Client, MessageEmbed  = require('discord.js');
const client = new Client();
const TOKEN = require('./config.json');

client.login(TOKEN.token);

client.on('ready', () => 
    console.log("Bot is online and ready!")
)

client.on('message', message =>
    if(message.author.bot)
    
        if(message.embeds)
        
            const embedMsg = message.embeds.find(msg => msg.title === 'Application Access');
            if(embedMsg)
            
                embedMsg.message.react('????')
                .then(reaction => reaction.message.react('????'))
                .catch(err => console.error);
            
        
        return;
    

    if(message.content.toLowerCase() === ']roles')
    
        const embed = new MessageEmbed();
        embed.setTitle("Application Access");
        embed.setColor("GREEN");
        embed.setDescription("React with the emoji and you will be able to apply for Logistics!\n" +
        "\n" +
        "\???? - Applicant");
        message.channel.send(embed);
    
)

client.on('messageReactionAdd', (reaction, user) => 
   if(user.bot)
    return;

   var roleName = "Applicant";
   var role = reaction.message.guild.roles.find(role => role.name.toLowerCase() === roleName.toLowerCase());
   var member = reaction.message.guild.members.find(member => member.id === user.id);

    member.addRole(role.id).then(member => 
        console.log("Added " + member.user.username + " to Applicant.");
    ).catch(err => console.error);
);

client.on('messageReactionRemove', (reaction, user) => 
    if(user.bot)
        return;

        var roleName = "Applicant";
        var role = reaction.message.guild.roles.find(role => role.name.toLowerCase() === roleName.toLowerCase());
        var member = reaction.message.guild.members.find(member => member.id === user.id);

        if(member.roles.has(role.id))
        
            member.removeRole(role.id).then(member => 
                console.log("Removed " + member.user.username + " from Applicant role.");
            ).catch(err => console.error);
        
)

感谢任何帮助!

【问题讨论】:

【参考方案1】:

message 不是 MessageEmbed 属性,这就是您的机器人出错的原因。

// change:
const embedMsg = message.embeds.find(
 (msg) => msg.title === 'Application Access'
);

if (embedMsg) 
 embedMsg.message
  .react('?')
  .then((reaction) => reaction.message.react('?'))
  .catch((err) => console.error);


// to:
if (message.embeds[0].title === 'Application Access') 
 message
  .react('?') // you can't react to the same message twice
  .catch(console.error);


另外,您的代码中有很多过时的v11.x 函数,例如addRole()。我建议查看this post 来修复它们。

【讨论】:

以上是关于为啥我的 Discord 机器人在发出命令后立即崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Heroku Discord 机器人无法连接到端口后崩溃? [复制]

前缀更改后重新加载不和谐机器人 (Discord.py)

Discord.js:机器人应该提到执行命令的用户

我的 Discord 机器人多次响应一个命令,我想知道是不是有办法只发送一次

为啥我的 node.js discord.js 机器人不发送文件? (没有错误)(可以发送消息)

discord.py 机器人不回复命令