【问题标题】:TypeError: Cannot read property 'send' of undefined - discord.jsTypeError:无法读取未定义的属性“发送”-discord.js
【发布时间】:2021-11-02 10:49:00
【问题描述】:

我正在尝试制作一个静音命令,该命令还会在日志通道中发送嵌入信息,以便记录用户已被静音。这是我的错误:

[Spuka#2670]: [mute]
/home/container/commands/mute.js:68
        channel.send(logEmbed);
                ^

TypeError: Cannot read property 'send' of undefined

这是我的 mute.js 文件:

const Discord = require('discord.js');
const { Client, WebhookClient, MessageEmbed, Bot, Intents } = require('discord.js');
const client = new Discord.Client({ intents: [Intents.FLAGS.GUILDS] });

require('discord-reply');
const fs = require('fs');
const ms = require('ms')
const config = require("../config.json");
const ginfo = require("../guild.json");

const BOTTOKEN = (config.bottoken);
const OWNERID = (config.botownerid);
const PREFIX = (config.prefix);
const STATUS = (config.status);
const GUILDID = (ginfo.guildID);
const MODID = (ginfo.moderatorID);
const LOGID = (ginfo.logChannelID);

module.exports = {
  name: 'mute',
  description: 'This command mutes a member.',
  execute(message, args) {
    if (message.member.permissions.has("MANAGE_MESSAGES")  || message.author.id === (config.botownerid)) {
      const target = message.mentions.users.first();
      if (target) {
        let mainRole = message.guild.roles.cache.find(role => role.name === 'Member');
        let muteRole = message.guild.roles.cache.find(role => role.name === 'Muted');

        let MemberTarget = message.guild.members.cache.get(target.id);

        if (!args[1]) {
          MemberTarget.roles.remove(mainRole.id);
          MemberTarget.roles.add(muteRole.id);
          const muteEmbed = new MessageEmbed()
            .setColor('RANDOM')
            .setTitle('Member Muted')
            .setDescription(`**User:** <@${MemberTarget.id}>\n**Moderator:** <@${message.author.id}>`)
            .setTimestamp()
            .setFooter(`Muted by ${message.author.tag}`, `${message.author.avatarURL()}`)
          message.lineReplyNoMention(muteEmbed);
          channel = client.channels.cache.get(LOGID);
          const logEmbed = new MessageEmbed()
            .setColor('RANDOM')
            .setTitle('Member Muted')
            .setDescription(`**User:** <@${MemberTarget.id}>\n**Moderator:** <@${message.author.id}>`)
            .setTimestamp()
            .setFooter(`Muted by ${message.author.tag}`, `${message.author.avatarURL()}`)
          channel.send(logEmbed);
          return
        }
        MemberTarget.roles.remove(mainRole.id);
        MemberTarget.roles.add(muteRole.id);

        const muteEmbed = new MessageEmbed()
          .setColor('RANDOM')
          .setTitle('Member Muted')
          .setDescription(`**User:** <@${MemberTarget.id}>\n**Moderator:** <@${message.author.id}>\n**Duration:** ${ms(ms(args[1]))}`)
          .setTimestamp()
          .setFooter(`Muted by ${message.author.tag}`, `${message.author.avatarURL()}`)
        message.lineReplyNoMention(muteEmbed);
        channel = client.channels.cache.get(LOGID);
        const logEmbed = new MessageEmbed()
          .setColor('RANDOM')
          .setTitle('Member Muted')
          .setDescription(`**User:** <@${MemberTarget.id}>\n**Moderator:** <@${message.author.id}>\n**Duration:** ${ms(ms(args[1]))}`)
          .setTimestamp()
          .setFooter(`Muted by ${message.author.tag}`, `${message.author.avatarURL()}`)
        channel.send(logEmbed);

        setTimeout(function(){
          MemberTarget.roles.add(mainRole.id);
          MemberTarget.roles.remove(muteRole.id);
        }, ms(args[1]));

      } else {
        const cmuteEmbed = new MessageEmbed()
          .setColor('#F04848')
          .setDescription(`**${message.author.tag}**, you cannot mute that member.\nThe user may not exist or the bot may not have permission.`)
        message.lineReply(cmuteEmbed)
      }
    } else {
      const nopermEmbed = new MessageEmbed()
        .setColor('#F04848')
        .setDescription(`**${message.author.tag}**, you are missing the "**MANAGE_MESSAGES**" permission.`)
      message.lineReply(nopermEmbed)
    }
  }
};

我的所有审核命令(ban、unban、mute、unmute、kick、clear)都出现了这个问题。我认为问题在于没有定义客户端,但我不能 100% 确定为什么会这样,因为我已经在代码的最顶部定义了它。 无论如何,让我知道是否有人可以提供帮助。谢谢。

【问题讨论】:

    标签: node.js discord.js


    【解决方案1】:

    您必须在 execute() 的参数中包含客户端

    【讨论】:

    • 当我尝试这样做时,我得到了这个错误:/home/container/commands/presence.js:36 client.user.setPresence({ ^ TypeError: Cannot read property 'setPresence' of null at /home/container/commands/presence.js:36:24
    • 这与您分享的颂歌无关。显然,这是另一个文件。您可以创建另一个关于堆栈溢出的问题
    【解决方案2】:

    我想在这里指出几点:

    • 问题本身的错误是因为client 没有在同一个文件中定义(这是一种不好的做法,在执行函数中从您的主文件中导入它会有所帮助),如何解决?
    
       <command>.execute(client, message, args); // in your main file
        execute(client, message, args) {... } // in your code files
    
    
    • this 评论中提到的错误,您只能在客户端处于ready 状态时调用setPresence() 函数,请务必将其添加到
    
       client.once("ready", () => {...})
    
    

    或者,如果它是其他文件,例如有一个!setstatus 命令将您的客户端导出为函数参数是您的最佳选择! ?

    【讨论】:

      【解决方案3】:

      在您的代码中,您尝试通过执行client.channels.cache.get(LOGID); 来获取频道。问题是您没有添加在执行命令中添加的客户端参数。您需要做的是将客户端参数添加到您的执行函数中。您需要更改以下内容:

      在您的主文件中的某处,您正在调用静音文件的执行函数。您现在拥有的将与此类似:

      require('./mute.js').execute(message, args);
      

      您需要将其更改为:

      require('./mute.js').execute(client, message, args); // Change './mute.js' of course to the location of your file
      

      完成此操作后,您需要将静音文件中的以下行更改为:

      execute(message, args) { // This is what you now have
      // Change it to
      execute(client, message, args) {
      

      更改此设置后,您将客户端参数传递给静音文件,这使您能够获取要发送消息的通道。

      您还必须从 mute.js 文件中删除以下行

      const client = new Discord.Client({ intents: [Intents.FLAGS.GUILDS] });
      

      您将无法使用此客户端,因为您尚未登录。这意味着您需要登录此客户端。

      【讨论】:

        猜你喜欢
        • 2020-06-17
        • 2021-04-12
        • 2021-06-27
        • 2021-04-17
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        • 2021-04-16
        • 2020-06-05
        相关资源
        最近更新 更多