未定义不是有效的uri或options对象discord.js

时间:2018-06-19 21:09:06

标签: node.js discord discord.js

今天,我编写了一个discord.js机器人,但是我的机器人使用此API发送强壮的统计信息时出错:https://fortnite.y3n.co,当我执行命令 / fs'someone'时遇到此错误

  

UnhandledPromiseRejectionWarning:错误:未定义不是有效的URI或选项对象。

我的代码:

const botconfig = require("./botconfig.json");
const Discord = require("discord.js");
const Client = require('fortnite')
const fortnite = new Client(botconfig.apifortnite)
const bot = new Discord.Client({disableEveryone: true});
let request = require('request');

bot.on("ready", async () => {
  console.log(`${bot.user.username} is online!`);
  bot.user.setStatus('dnd');
  bot.user.setActivity("©ZyD3");
});

bot.on("message", msg => {

    let prefix = botconfig.prefix;
    if (msg.author.bot) return;
    let msgArray = msg.content.split(" ");
    let cmd = msgArray[0];
    let args = msgArray.slice(1)
    let playerName = args[1];
    if(cmd === `${prefix}fs`)
    var options = {
    method: "GET",
    uri: `https://fortnite.y3n.co/v2/player/${playerName}`,
    headers: {
      'User-Agent': 'nodejs request',
      'X-Key': "api key"
    }
  }

  console.log(args);


  request(options, (error, response, body) => {
    if (!error && response.statusCode == 200) {
      var stats = JSON.parse(body);

      let embedFortnite = new Discord.RichEmbed()
      .setTitle("Wukong Fortnite Tracker", true)
      .setDescription("This is the descrpition", true)
      .addField("Username", playerName)
      .addBlankField()
      .addField("Mode","This is your stats")
      .setColor("#EC44FF")
      .addField("Kills", `${stats.br.stats.pc.solo.kills}`, true)
      .addField("Deaths", `${stats.br.stats.pc.solo.deaths}`, true)
      .addField("K/d", `${stats.br.stats.pc.solo.kpd}`, true)
      .addField("Winrate", `${stats.br.stats.pc.solo.winRate}`, true)
      .addField("Kpm", `${stats.br.stats.pc.solo.kpm}`, true)
      .addField("Minutes Played", `${stats.br.stats.pc.solo.minutesPlayed}`, true)
      .addField("Matches Played", `${stats.br.stats.pc.solo.matchesPlayed}`, true);

    msg.channel.send(embedFortnite)

    }
  })
});


bot.login(botconfig.token);

1 个答案:

答案 0 :(得分:0)

从您的问题来看,您的命令看起来像/fs nickname

您提到的错误来自options对象。因此,您应该专注于该对象声明(该外观与您链接到的Fortnite Discord API非常相似):

var options = {
    method: "GET",
    uri: `https://fortnite.y3n.co/v2/player/${playerName}`,
    headers: {
        'User-Agent': 'nodejs request',
        'X-Key': "api key"
    }
}

您的错误提到uri组件可能被弄乱了,唯一可能被弄乱的部分是playerName,它来自代码中的这些行(以及其他一些有趣的变量) :

let msgArray = msg.content.split(" ");
let cmd = msgArray[0];
let args = msgArray.slice(1)
let playerName = args[1];

如果逐行运行这些var,您将获得:

  • msgArray变成['/fs', 'nickname']
  • cmd变成'/fs'
  • args变成['nickname']
  • playerName变成undefined,因为'nickname'字符串实际上位于args数组的索引0中。

尝试将msgArray.slice(1)更改为msgArray.slice(0) args[1]更改为args[0],并告诉我您是否可以继续。< / p>

编辑:如果仍然无法执行,请在声明console.log(playerName)对象以确保options存在并符合您的期望之前尝试使用playerName就是这样。

修复#2 :啊,现在我明白了问题所在。您是在上方的var object中声明您的if-statement。我要引用的代码片段是这样的:

  if(cmd === `${prefix}fs`)
  var options = {
  method: "GET",
  uri: `https://fortnite.y3n.co/v2/player/${playerName}`,
  headers: {
    'User-Agent': 'nodejs request',
    'X-Key': "api key"
  }
}

您所拥有的间距使事情有些混乱,这很可能使您失望。这是相同的代码,其间隔应为:

if(cmd === `${prefix}fs`)
  var options = {
    method: "GET",
    uri: `https://fortnite.y3n.co/v2/player/${playerName}`,
    headers: {
      'User-Agent': 'nodejs request',
      'X-Key': "api key"
    }
  }

如您所见,您的if-statement在解析为true时,只会创建一个局部变量options(因为从技术上讲,它位于if-statement块内)。一旦该行结束(该块内的一行是变量options的创建),变量options就丢失了,因为我们在该if-statement块内停留的时间更长。

要解决此问题,您可以采用以下两种解决方法之一(我认为您有意做#1):

#1 :在此if-statement之后添加大括号,将整个命令括起来。这就是我的意思:

// ... your cmd / args / playerName variable creation here

if (cmd === `${prefix}fs`) { // <-- ADDED OPENING BRACKET HERE
  var options = {
    method: "GET",
    uri: `https://fortnite.y3n.co/v2/player/${playerName}`,
    headers: {
      'User-Agent': 'nodejs request',
      'X-Key': "api key"
    }
  }

  request(options, (error, response, body) => {
    // ... your request handling code here
  });
} // <-- ADDED CLOSING BRACKET HERE

// ... your other commands, or whatever other code here

#2 :在options之前创建一个变量if-statement,在object之后的那一行中实例化if-statement,然后正常进行。我不建议这样做,因为将来您会遇到其他命令的问题(我认为)。这就是我的意思:

// create options object outside of if-statement
var options = {};

if(cmd === `${prefix}fs`)
  // fill options object with your... options!
  options = {
    method: "GET",
    uri: `https://fortnite.y3n.co/v2/player/${playerName}`,
    headers: {
      'User-Agent': 'nodejs request',
      'X-Key': "api key"
    }
  }

注意:如果使用选项#2,则在调用options之前,您仍应检查以确保request(options...)存在