YouTube PlaylistItems API вызывает синтаксические ошибки при использовании JSON .parse () - PullRequest
0 голосов
/ 02 мая 2020

У меня есть 2 вызова API YouTube v3 в моем коде NodeJS: каналы и PlaylistItems . Они оба возвращают JSON, и ответ на первый вызов анализируется очень хорошо, но анализ ответа на второй вызов вызывает синтаксическую ошибку. Я не уверен, является ли это ошибкой на моей стороне или в конечной точке API PlaylistItems.

Вот мой код (удален несущественные части):

// At start of the bot, fetches the latest video which is compared to if an announcement needs to be sent
function setLatestVideo () {
    fetchData().then((videoInfo) => {
        if (videoInfo.error) return;

        latestVideo = videoInfo.items[0].snippet.resourceId.videoId;
    });
}

// Fetches data required to check if there is a new video release
async function fetchData () {
    let path = `channels?part=contentDetails&id=${config.youtube.channel}&key=${config.youtube.APIkey}`;
    const channelContent = await callAPI(path);

    path = `playlistItems?part=snippet&maxResults=1&playlistId=${channelContent.items[0].contentDetails.relatedPlaylists.uploads}&key=${config.youtube.APIkey}`;
    const videoInfo = await callAPI(path);

    return videoInfo;
}

// Template HTTPS get function that interacts with the YouTube API, wrapped in a Promise
function callAPI (path) {
    return new Promise((resolve) => {

        const options = {
            host: 'www.googleapis.com',
            path: `/youtube/v3/${path}`
        };

        https.get(options, (res) => {
            if (res.statusCode !== 200) return;

            const rawData = [];
            res.on('data', (chunk) => rawData.push(chunk));
            res.on('end', () => {
                try {
                    resolve(JSON.parse(rawData));
                } catch (error) { console.error(`An error occurred parsing the YouTube API response to JSON, ${error}`); }
            });

        }).on('error', (error) => console.error(`Error occurred while polling YouTube API, ${error}`));
    });
}

Примеры ошибок, которые я получаю : Неожиданный токен, в JSON и Неожиданное число в JSON

До ~ 2 недель go этот код работал нормально без броска любые ошибки, я понятия не имею, что изменилось, и не могу понять это. Что может быть причиной этого?

1 Ответ

0 голосов
/ 03 мая 2020

10 минут спустя я разобрался с исправлением! Переменная rawData содержит Buffer, и, посмотрев более подробно, я решила, что, вероятно, мне следует использовать Buffer.concat() на rawData перед вызовом JSON.parse(). Оказывается, это именно то, что было нужно.

Я до сих пор не уверен, как это вызывало проблемы только через 6 месяцев после написания этого кода, но это обычно происходит.

Измененный код:

res.on('end', () => {
                try {
                    resolve(JSON.parse(Buffer.concat(rawData)));
                } catch (error) { console.error(`An error occurred parsing the YouTube API response to JSON, ${error}`); }
            });
...