今天,我编写了一个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);
答案 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...)
存在