Зацикливание запроса на выборку

avatar
MG91
1 июля 2021 в 20:45
21
2
0

У меня есть список пользователей в моей базе данных, и я хочу получить их данные из API Discord

Я не могу просмотреть данные, и когда я использую resolve(users.json());, я получаю TypeError: users.json не является функцией

Моя функция:

async function getTopUsers(discord_id) {
// Get Token
const token = await db.query(`SELECT accesstoken FROM tokens WHERE discord_id = ${discord_id}`);
const encryptedAccessToken = token.rows[0].accesstoken;
const decrypted = decrypt(encryptedAccessToken);
const accessToken = decrypted.toString(CryptoJS.enc.Utf8);
// Get list top users
const topUsers = await db.query(`SELECT discord_user, discord_user_points FROM discord ORDER BY discord_user_points DESC LIMIT 10`)

return new Promise(async (resolve, reject) => {
    try {

        const users = [];

        // Loop through top users and fetch them from discord api
        for (let i = 0; i < topUsers.rows.length; i++) {
            const user = await fetch(`${DISCORD_API}/users/${topUsers.rows[i].discord_user}`, {
                method: 'GET',
                headers: { Authorization: `Bot ${process.env.DISCORDTOKEN}` }
            });
            users.push(user);
        }

        resolve(users.json());
    } catch (error) {
        reject(error);
    }
});
}
Источник

Ответы (2)

avatar
jfriend00
1 июля 2021 в 20:51
2

Основная проблема заключается в том, что вы должны вызывать .json() при прямом ответе на вызов fetch(), а не на самом массиве.

Вам также не нужно оборачивать другие промисы вокруг существующих промисов. Вот упрощенная и исправленная версия:

.
async function getTopUsers(discord_id) {
    // Get Token
    const token = await db.query(`SELECT accesstoken FROM tokens WHERE discord_id = ${discord_id}`);
    const encryptedAccessToken = token.rows[0].accesstoken;
    const decrypted = decrypt(encryptedAccessToken);
    const accessToken = decrypted.toString(CryptoJS.enc.Utf8);
    // Get list top users
    const topUsers = await db.query(
        `SELECT discord_user, discord_user_points FROM discord ORDER BY discord_user_points DESC LIMIT 10`)

    const users = [];
    try {
        // Loop through top users and fetch them from discord api
        for (let i = 0; i < topUsers.rows.length; i++) {
            const resp = await fetch(`${DISCORD_API}/users/${topUsers.rows[i].discord_user}`, {
                method: 'GET',
                headers: { Authorization: `Bot ${process.env.DISCORDTOKEN}` }
            });
            const user = await resp.json();
            users.push(user);
        }
    } catch (e) {
        console.log(e);
        throw e;
    }
    return users;

}
MG91
1 июля 2021 в 21:18
1

Это помогло, спасибо! Я новичок в обещаниях/асинхронности, ваш ответ мне очень помог.

avatar
Luke Ingalls
1 июля 2021 в 20:48
0

То, как вы это делаете, создает массив ответов. Если вы хотите jsonify пользователя, вам, вероятно, нужно сделать

users.push(await user.json())