Преобразовать группу аргументов в переменную в Node.js ?

#node.js #discord #discord.js

#node.js #Discord #discord.js

Вопрос:

Итак, у меня есть бот Discord, и мне пришла в голову идея добавить к нему команду weather. Я добился того, что часть, в которой сообщение отправляется во внедрении, заработала, но для запуска команды мне пришлось бы выполнить ее с указанием города и штата без пробелов ( /weather SanFrancisco CA вот как это выглядело бы). Что я хочу сделать, так это сделать так, чтобы по крайней мере команда могла содержать пробелы, подобные этому: /weather San Fransisco CA или /weather 'San Fransisco' CA . Вот мой код (я удалил ненужные части).

 const Discord = require('discord.js')
const bot = new Discord.Client()
const PREFIX = '/';
const embed = new Discord.MessageEmbed()
const ping = require('minecraft-server-util')
const weather = require('weather-js')
bot.on('message', message => {
  if (message.channel.type === 'dm') {return}
  let args = message.content.substring(PREFIX.length).split(' ')
  if(message.content.startsWith(PREFIX))
  switch (args[0]) {
    case 'weather':
      weather.find({search: `${args[1]}, ${args[2]}`, degreeType: 'F'}, function(err, result) {
        if(err) console.log(err);
        var currentw = new Discord.MessageEmbed()
          .setTitle(`Current Weather in ${args[1]} in state ${args[2]}`)
          .addField('Temperature', result[0].current.temperature)
          .addField('Sky Text', result[0].current.skytext)
          .addField('Humidity', result[0].current.humidity)
          .addField('Wind Speed amp; Direction', result[0].current.winddisplay)
          .addField('Feels Like', result[0].current.feelslike)
          .addField('Location', result[0].current.observationpoint)
          .addField('Time', result[0].current.observationtime)
          .addField('Date', result[0].current.date)
        message.channel.send(currentw)
      });
}})
  bot.login(TOKEN);
  

Ответ №1:

Если вы хотите использовать кавычки, вы можете разделить строку следующим образом:

 let foo = ""San Francisco" CA";
let args = foo.split(""");

console.log(args);
  

Это вернет:
[ '', 'San Francisco', ' CA' ]

Вы можете просто удалить первый индекс, выполнив:

 args.splice(0, 1);
  

И это вернет:
[ 'San Francisco', ' CA' ]

Редактировать: Исправлена опечатка.

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

1. Я понимаю, о чем вы говорите, но я хотел бы иметь возможность заменить ""San Francisco" CA" аргументом, переданным из сообщения Discord.

2. Вы можете легко сделать это, превратив значение foo variables в этот аргумент. Если вас смущает " это просто экранирование " и является обычным " .

Ответ №2:

Я не уверен, что это самый эффективный способ, но если вы разделите на пробел, вы сможете выполнить цикл for, чтобы определить аргументы и объединить их все в строку.

 const Discord = require('discord.js')
const bot = new Discord.Client()
const PREFIX = '/';
const embed = new Discord.MessageEmbed()
const ping = require('minecraft-server-util')
const weather = require('weather-js')
bot.on('message', message => {
  if (message.channel.type === 'dm') {return}
  let args = message.content.substring(PREFIX.length).split(' ')
  if(message.content.startsWith(PREFIX))
  switch (args[0]) {
    case 'weather':
    let city;
    for (let i = 1; i < args.length - 1; i = 1) {
      city  = args[i];
    }
    weather.find({search: `city, ${args[args.length - 1]}`, degreeType: 'F'}, function(err, result) {
            if(err) console.log(err);
            var currentw = new Discord.MessageEmbed()
              .setTitle(`Current Weather in ${args[1]} in state ${args[2]}`)
              .addField('Temperature', result[0].current.temperature)
              .addField('Sky Text', result[0].current.skytext)
              .addField('Humidity', result[0].current.humidity)
              .addField('Wind Speed amp; Direction', result[0].current.winddisplay)
              .addField('Feels Like', result[0].current.feelslike)
              .addField('Location', result[0].current.observationpoint)
              .addField('Time', result[0].current.observationtime)
              .addField('Date', result[0].current.date)
            message.channel.send(currentw)
          });
    }})
      bot.login(TOKEN);
  

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

1. Спасибо за ответ. Однако, когда я попробовал этот код, он вылетает. (С ошибкой city is not defined )