【问题标题】:Discord help command - args.join isn't a functionDiscord 帮助命令 - args.join 不是函数
【发布时间】:2020-03-13 05:43:50
【问题描述】:

我正在使用我的不和谐机器人处理帮助命令。 我的帮助命令访问的命令列表文件是:

{
    "Help": {
        "name":"Help",
        "group":"User",
        "desc":"Displays a list of commands",
        "usage":"help [group OR command]"
    },

    "Purge": {
        "name":"Purge",
        "group":"Admin",
        "desc":"Deletes a specified number of messages",
        "usage":"Purge <amount>"
    }
}

这些只是定义命令的组、名称和用法。到目前为止,帮助命令的代码是:

const Discord = require('discord.js');
const bot = new Discord.Client();
const client = new Discord.Client();
const weather = require('weather-js');
const fs = require('fs');
const commands = JSON.parse(fs.readFileSync('Storage/commands.json', 'utf8'))
const token = "<my token>"
const prefix = 'cb!';

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

    // Variables
    let msg = message.content.toUpperCase();
    let sender = message.author;
    let cont = message.content.slice(prefix.length).split(" ");
    let args = cont.shift().toLowerCase();

    if (message.content.startsWith(prefix+'help')) {

            console.log('ok i hate this')

            const embed = new Discord.RichEmbed()
                .setColor(0x1D82B6)



            let commandsFound = 0;

            for (var cmd in commands) {

                if (commands[cmd].group.toUpperCase() === 'USER') {
                    commandsFound++

                    embed.addField(`${commands[cmd].name}`, `**Description:** ${commands[cmd].desc}\n**Usage:** ${prefix + commands[cmd].usage}`);
                }


            }

            embed.setFooter(`Currently showing user commands. To view another group do ${prefix}help [group / command]`)
            embed.setDescription(`**${commandsFound} commands found** - <> means required, [] means optional`)

            message.author.send({embed})
            message.channel.send({embed: {
                color: 0x1D82B6,
                description: `**Check your DMs ${message.author}!**`
            }})

            } else {
                // Variables
                let groupFound = '';

                for (var cmd in commands) {

                    if (args.join(" ").trim().toUpperCase() === commands[cmd].group.toUpperCase()) {
                        groupFound = commands[cmd].group.toUpperCase();
                        break;
                    }

                }

                if (groupFound != '') {
                    for (var cmd in commands) {

                        const embed = new Discord.RichEmbed()
                        .setColor(0x1D82B6)



                        let commandsFound = 0;

                        if (commands[cmd].group.toUpperCase() === groupFound) {
                            commandsFound++

                            embed.addField(`${commands[cmd].name}`, `**Description:** ${commands[cmd].desc}\n**Usage:** ${prefix + commands[cmd].usage}`);
                        }


                    }

                    embed.setFooter(`Currently showing ${groupFound} commands. To view another group do ${prefix}help [group / command]`)
                    embed.setDescription(`**${commandsFound} commands found** - <> means required, [] means optional`)

                    message.author.send({embed})
                    message.channel.send({embed: {
                        color: 0x1D82B6,
                        description: `**Check your DMs ${message.author}!**`
                    }})

                }



    }

});

如果我输入“cb!help admin”,我会在控制台中收到此错误

                    if (args.join(" ").trim().toUpperCase() === commands[cmd].group.toUpperCase()) {
                             ^

TypeError: args.join is not a function

我可以做些什么来解决这个问题?我也尝试过if (args[0].join...,但这不起作用。

一如既往,感谢您抽出宝贵时间阅读本文。我是基于过时的代码,所以可能还有其他一些错误。我也在尝试修复它们。

【问题讨论】:

    标签: javascript node.js discord discord.js


    【解决方案1】:

    args 在您的代码示例中有一个定义:

    let args = cont.shift().toLowerCase();
    

    这使得 args 成为 string - string 没有方法 join() 因为 join() 是数组原型链的一部分,字符串不继承自该链。 shift() 将返回 cont 数组的第一个元素,因此您可能只想调用 args.toUpperCase(),尽管我建议重命名变量以使 args 的含义更清晰。

    【讨论】:

    • 那我该怎么办呢? (arguments.join(" ").trim().toUpperCase() === commands[cmd].group.toUpperCase()) 会起作用吗?
    • 根据我认为您的代码正在执行的操作,您需要删除对join() 的调用。听起来您只想将第一个参数(可能是命令)与您存储的一组命令进行比较。如果是这种情况,那么删除 join() 就可以了。 join() 的意思是……将一个元素数组连接成一个字符串。你已经一个字符串了。
    • 好的,我会尽快回复你
    • 现在我没有收到错误,但它仍然没有发送指定的组。你介意使用聊天来帮助我吗?
    【解决方案2】:

    您应该尝试在顶部交换两个变量,以便

    let args = message.content.slice(prefix.length).split(' ');
    let cont = args.shift().toLowerCase();
    

    然后将 args 放入你的 if 语句中

    if (args[0].toUpperCase === commands[cmd].group.toUpperCase) { /* Your code... */ }
    

    您的参数已经存储在一个数组中,因此无需修剪它们,因此也不需要连接函数。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2021-05-12
      • 2018-05-06
      • 2021-01-01
      • 1970-01-01
      • 2021-04-12
      • 2020-07-09
      • 2020-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多