簡體   English   中英

檢查 JSON 中的變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM