[英]Checking for a variable in a JSON
client.on("message", message => {
if (!message.content.startsWith(prefix) || message.author.bot) return;
const args = message.content.slice(prefix.length).split(/ +/);
const command = args.shift().toLowerCase();
if (command === `osu`) {
if (!args.length) {
const warn2 = new Discord.MessageEmbed()
.setTitle(`Eek!`)
.setDescription(`Please type a username to check!`)
.setColor('#ffb9f4')
message.channel.send(warn2);
} else {
const userosu = new Discord.MessageEmbed()
got(`https://osu.ppy.sh/api/get_user?k=API_KEY&u=${args}`).then(response => {
var response = JSON.parse(response.body)
console.log(response)
if (response.body) {
message.channel.send('Invalid User!')
return;
} else {
var num = response[0].accuracy;
var n = toFixed(num, 2);
var num2 = response[0].level;
var n2 = toFixed(num2, 0);
var num3 = response[0].pp_raw;
var n3 = toFixed(num3, 2);
userosu.setAuthor(`User info for player ${response[0].username}`, `http://s.ppy.sh/a/${response[0].user_id}`, `https://osu.ppy.sh/u/${response[0].user_id}`)
userosu.setDescription(`**» Rank:** #${response[0].pp_rank} (${response[0].country}#${response[0].pp_country_rank}) \n**» Total PP:** ${n3} \n**» Accuracy:** ${n}% \n**» Level:** ${n2} \n**» Play count:** ${response[0].playcount}`)
message.channel.send(userosu)
}
});
}
}
});
我現在關注的部分是
if (!response.body) {
message.channel.send('Invalid User!')
return;
} else {
var num = response[0].accuracy;
var n = toFixed(num, 2);
var num2 = response[0].level;
var n2 = toFixed(num2, 0);
var num3 = response[0].pp_raw;
var n3 = toFixed(num3, 2);
userosu.setAuthor(`User info for player ${response[0].username}`, `http://s.ppy.sh/a/${response[0].user_id}`, `https://osu.ppy.sh/u/${response[0].user_id}`)
userosu.setDescription(`**» Rank:** #${response[0].pp_rank} (${response[0].country}#${response[0].pp_country_rank}) \n**» Total PP:** ${n3} \n**» Accuracy:** ${n}% \n**» Level:** ${n2} \n**» Play count:** ${response[0].playcount}`)
message.channel.send(userosu)
}
});
使用 osu: API: https://github.com/ppy/osu-api/wiki ,如果在機器人中輸入了無效的用戶名,我會嘗試返回。 目前,使用正確的用戶可以正常工作,但輸入無效的用戶名會導致此錯誤: (node:42596) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'accuracy' of undefined
這與
var num = response[0].accuracy;
var n = toFixed(num, 2);
我試圖了解我做錯了什么,因為我在這類事情上不是很有經驗。 作為參考,輸入一個好的用戶名會帶回
[
{
user_id: '2',
username: 'peppy',
join_date: '2007-08-28 03:09:12',
count300: '657863',
count100: '118557',
count50: '25576',
playcount: '7356',
ranked_score: '427516167',
total_score: '1903116877',
pp_rank: '497537',
level: '66.0953',
pp_raw: '829.834',
accuracy: '97.14646911621094',
count_rank_ss: '15',
count_rank_ssh: '0',
count_rank_s: '70',
count_rank_sh: '0',
count_rank_a: '115',
country: 'AU',
total_seconds_played: '721608',
pp_country_rank: '11453',
events: []
}
]
輸入錯誤的用戶名時放回
[]
你有幾個選擇:
1.在嘗試從中獲取accuracy
值之前,您可以先檢查響應是否為空數組:
if (!Array.isArray(response) || response.length === 0) {
// error handling
} else {
var num = response[0].accuracy;
var n = toFixed(num, 2);
// ...etc
}
2.您可以使用可選的鏈接運算符首先將項目拉出,然后使用nullish coalescing 運算符作為后備:
var num = response?.[0]?.accuracy ?? 0;
var n = toFixed(num, 2); // will be toFixed(0, 2) if response is empty
3. 您可以將快樂路徑(其中存在響應)的整個操作包裝在try...catch
中,並將錯誤處理放在catch
中:
try {
var num = response?.[0]?.accuracy ?? 0;
var n = toFixed(num, 2); // will be toFixed(0, 2) if response is empty
// etc...
} catch (error) {
// handle error
console.log('something went wrong:', error);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.