首页 > 解决方案 > 如何修复 TypeError:无法读取 discord.js 中未定义的属性“执行”

问题描述

我是命令处理程序的新手,我正在尝试为不同的 js 文件执行命令

但我得到这个错误

TypeError:无法读取未定义的属性“执行”

这是我的 main.js

// Import the discord.js module
const Discord = require('discord.js');
const fs = require('fs');
// Create an instance of a Discord client
const client = new Discord.Client();
client.commands = new Discord.Collection();
const commandFiles = fs.readdirSync('./commands').filter(file => file.endsWith('.js'));
const prefix = "$"

/**
 * The ready event is vital, it means that only _after_ this will your bot start reacting to information
 * received from Discord
 */
client.on('ready', () => {
  console.log('I am ready!');
});
 
client.on('message', message => {
  if (!message.content.startsWith(prefix) || message.author.bot) return;

  const args = message.content.slice(prefix.length).trim().split(/ +/);
  const command = args.shift().toLowerCase();


  if(command === 'pingg'){
    client.commands.get('pingg').execute(message, args);
  }




  if (!client.commands.has(command)) return;

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

fs.readdir("./commands/", (err, files) => {
  if(err) console.error(error)
  let jsfiles = files.filter(f => f.split(".").pop() === "js")
  if (jsfiles.length <= 0) {
    return console.log("No commands to log in FOLDER NAME")
  }
  console.log(`Loading ${jsfiles.length} commands from FOLDER NAME...`)
  jsfiles.forEach((f,i) => {
    let props = require(`./commands/${f}`)
    console.log(`${i + 1}: ${f} loaded!`)
    client.commands.set(f, props)
  })
})

我的 ping.js

module.exports = {
    name : 'pingg',
    description : 'Test',
    
    execute(message, args){
        message.channel.send('pongg')
    }
}

标签: javascriptnode.jsdiscord

解决方案


client.commands客户端准备好后,这些命令将在机器人应用程序生命周期中注册到集合中。这是因为client.login在它之前被调用。

您可以使用commandFiles从其模块加载命令。这已经同步执行,因此您对订单有一定的保证。在声明之前也要这样做client.login

另一个问题是命令模块被命名ping.js,因此您当前的实现将 ping 命令注册到client.command集合。但是,您正在pingg从返回的集合中解析命令undefined

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

client.login('censored');

//...

推荐阅读