Discord.js v12, потенциальная ошибка разделения, считывающая аргументы после команды и выполняющая ее

#javascript #discord.js

#javascript #discord.js

Вопрос:

Итак, ошибка, которую я получаю, но не могу найти, заключается в принятии любых аргументов в качестве допустимой команды после пробела. Я считаю, что это может быть .split() ошибкой, так как если вы точно сопоставите аргументы, это приведет к другому результату. Теперь, если вы используете аргумент, которого нет в списке, он все равно выдаст исходную команду, !qa = !qa mollusk

введите описание изображения здесь

Он должен возвращать ошибку, когда аргумент передается, но не присутствует, но не делает этого. Вот мой индекс и все, что связано с репликацией:

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

const featureFiles = fs.readdirSync('./commands/features').filter(file => file.endsWith('.js'));
for (const file of featureFiles) {
    const command = require(`./commands/features/${file}`);
    client.commands.set(command.name, command);
}
    
client.on('message', message => {
    if (!message.content.startsWith(prefix) || message.author.bot) return;
//.trim() is removed, see notes below on why
    const args = message.content.slice(prefix.length).split(/  /g);
    const commandName = args.shift().toLowerCase();

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

    if (!command) return;

    if (command.guildOnly amp;amp; message.channel.type !== 'text') {
        return message.reply('That command cannot be used inside a DM');
    }

    if (command.args amp;amp; !args.length) {
        let reply = `You didn't provide any arguments!`;

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

        return message.channel.send(reply);
    }

    try {
        command.execute(message, client, args);
    } catch (error) {
        console.error(error);
        message.channel.send('Error trying to execute command');
    }});
client.login(token);
  

Я удалил .trim() , поскольку он считывал пробелы между префиксом и именем команды, чего я не хотел, поэтому можно было использовать 100 пробелов между префиксом и командой, и он ее выполнит.
Вот мой модуль, который я создаю:

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

module.exports ={
  name: 'qa',
  description: 'Find members who have the QA role and search by specialty.',
  usage: '[OptionalArg]',
  execute(message, client, args) {
    if(message.channel.type === 'dm')  {
      message.channel.send('Command can't be used here')
    }

    try{

      let roleID = "738530035526402100";
      let membersWithRole = message.guild.roles.cache.get(roleID).members.map(m=>m.user.tag).join('n');

      const embed = new Discord.MessageEmbed()
      .setColor('#008798')
      .setTitle('Qualified Advice')
      .setDescription(`${membersWithRole}`)
      .setTimestamp(new Date)

      const testing = new Discord.MessageEmbed()
      .setColor('#008798')
      .setTitle('Test QA')
      .setDescription(`test`)
      .setTimestamp(new Date)

      const data =;

      if (args[0] === 'test') {
        return message.channel.send(testing)
      }
      message.channel.send(data, 'To see focus types, type `!qa [arg]`, example `!qa test`', {split: true});
    } catch(e) {
      console.log(e)
    }
  },
};
  

Прав ли я, думая, что это найдено в .split() ? Это ставит меня в тупик, возможно, я упускаю это из виду, он также делает то же самое с обычными командами, у которых нет никаких аргументов. Это заставило меня поверить, что это в index . Я хочу, чтобы он просто возвращался, если был сделан другой ввод (например ?qa alksjdkalsjd ), который не указан как аргумент.
Discord.js = v12

Ответ №1:

То, что вы хотите сделать, это реструктурировать свой if следующим образом:

 if(args.length === 0) { // this runs everytime there are no args provided
    return message.channel.send(data, 'To see focus types, type `!qa [arg]`, example `!qa test`', { split: true });
}
if (args[0] === 'test') {
    return message.channel.send(testing)
}
/* ........... */
return message.channel.send(error); // send a errror here if the args were not handled by the above cases
  

Комментарии:

1. Это сработало! хотя я внес изменения, чтобы он отправил их позже, но такая простая ошибка с моей стороны, спасибо! if (args.length === 0) { message.channel.send(data, {split: true}).then(message.channel.send('To see focus types, type ! qa [аргумент] , example ! проверка качества ')); }

2. Однако это работает не во всех командах, ошибка по-прежнему присутствует с аргументами или без них, например, с простой командой ?info, которая работала только в этом модуле, и применение ее к другим с аргументами в том же формате, что и выше, по-прежнему допускает другой ввод после команды.

3. Я не совсем понимаю, что вы имеете в виду под двумя комментариями выше, не могли бы вы, пожалуйста, уточнить?

4. Кроме того, пожалуйста, отметьте этот ответ как принятый, потому что он отвечает на ваш вопрос, если что-то еще не работает, пожалуйста, создайте новый вопрос.