简体   繁体   English

我在 Discord.js 中遇到诸如 client.users.cache.size 等功能的问题

[英]I'm having issues in Discord.js with functions like client.users.cache.size

Whenever I try to use a function like client.users.cache.size or client.guilds.size , they keep giving me an error like "TypeError: Cannot read property 'guilds' of undefined" or "TypeError: Cannot read property 'cache' of undefined" .每当我尝试使用client.users.cache.sizeclient.guilds.size之类的 function 时,它们都会给我一个错误,例如“TypeError:无法读取未定义的属性‘guilds’”“TypeError:无法读取属性‘cache’ ' 未定义的”

I was also trying to use let guilds = client.guilds.cache.array().join('\n') but it also throws the same error.我也尝试使用let guilds = client.guilds.cache.array().join('\n')但它也会引发相同的错误。

Command's code:命令代码:

const Discord = require('discord.js');

module.exports = {
    name: 'stats',
    description: 'Views the bot\'s stats',
    execute(client, message) {
        const embed = new Discord.MessageEmbed
        .setDescription(`In ${client.guilds.size} servers`)
        .setTimestamp()
        .setFooter(message.member.user.tag, message.author.avatarURL());
        message.channel.send(embed)
    }
}

Bot's main file:机器人的主文件:

const path = require('path');
const fs = require("fs");
const { token, prefix } = require('./config.json');
const Discord = require('discord.js');
const db = require ('quick.db');

const client = new Discord.Client
client.commands = new Discord.Collection();

const isDirectory = source => fs.lstatSync(source).isDirectory();
const getDirectories = source => fs.readdirSync(source).map(name => path.join(source, name)).filter(isDirectory);

getDirectories(__dirname + '/commands').forEach(category => {
  const commandFiles = fs.readdirSync(category).filter(file => file.endsWith('.js'));

  for(const file of commandFiles) {
    const command = require(`${category}/${file}`);
    client.commands.set(command.name, command);
  }
});

client.on("ready", () => {
    console.log(`ready!.`);
    console.log(token);
    
    // Activities  
    const activities_list = [ 
        `Serving Tacos | .help`,
        `Preparing Orders | .help`
    ];
    
    setInterval(() => {
        const index = Math.floor(Math.random() * (activities_list.length - 1) + 1);
        client.user.setActivity(activities_list[index]);
    }, 10000);
});

//Joined Guild
client.on("guildCreate", (guild) => {   
    const EmbedJoin = new Discord.MessageEmbed()
    .setColor('#FFFF33')
    .setTitle(`Joined Guild: ${guild.name}!`)
    .setTimestamp()
    console.log(`Joined New Guild: ${guild.name}`);
    client.channels.cache.get(`746423099871985755`).send(EmbedJoin)
});

//Left Guild
client.on("guildDelete", (guild) => {
    const EmbedLeave = new Discord.MessageEmbed()
    .setColor('#FFFF33')
    .setTitle(`Left Guild: ${guild.name}.`)
    .setTimestamp()
    console.log(`Left Guild: ${guild.name}`);
    client.channels.cache.get(`746423099871985755`).send(EmbedLeave)
});

client.on('message', message => {

    if (!message.content.startsWith(prefix) || message.author.bot) return;
    
    const args = message.content.slice(prefix.length).trim().split(/ +/);
    const commandName = args.shift().toLowerCase(); 

    const command = client.commands.get(commandName)
        || client.commands.find(cmd => cmd.aliases && cmd.aliases.includes(commandName));

    if (!command) return;

    if (command.guildOnly && message.channel.type === 'dm') {
        return message.reply('I can\'t execute that command inside DMs!');
    }

    if (command.args && !args.length) {
        let reply = `${message.author}, wrong usage`;

        if (command.usage) {
            reply += `\nThe proper usage would be: \`${prefix}${command.name} ${command.usage}\``;
        }

        return message.channel.send(reply);
    }

    try {
        command.execute(message, args);
    } catch (error) {
        console.error(error);
        message.reply('there was an error trying to execute that command!');
    }
});

process.on("error", () => {
    console.log("Oops something happened!");
});

client.login(token);

In your code, client.guilds returns a manager, so you have to use client.guilds.cache.size .在您的代码中, client.guilds返回一个经理,因此您必须使用client.guilds.cache.size The rest of the code works fine.代码的 rest 工作正常。

const Discord = require('discord.js');

module.exports = {
    name: 'stats',
    description: 'Views the bot\'s stats',
    execute(message, args, client) {
        const embed = new Discord.MessageEmbed
        .setDescription(`In ${client.guilds.cache.size} servers`)
        .setTimestamp()
        .setFooter(message.member.user.tag, message.author.avatarURL());
        message.channel.send(embed)
    }
}

In your main bot file you're only passing the message and the args (in this order) to command.execute() .在您的主机器人文件中,您仅将messageargs (按此顺序)传递给command.execute() You can add the client too, and update the parameters in your command's code to match this order.您也可以添加client ,并更新命令代码中的参数以匹配此命令。

try {
  command.execute(message, args, client);
} catch (error) {
   ...
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM