为什么“await”在 NextJS API 路由中不执行任何操作?

问题描述 投票:0回答:1

我正在尝试从 NextJS Api 路由的 YouTube 数据 API 获取数据(这应该是一个 cron 函数)。

我在获取数据时使用了await关键字(getPlaylistData()函数),但总是得到res is undefined的错误。 api 调用在没有 console.log(res.status) 的情况下进行并返回状态 200,所以我知道 API 调用是好的。

此外,我在 service.playlistItems.list 的回调中的 console.log() 函数中获得了正确的输出。 console.log(res.status) 似乎在 getPlaylistData() 函数完成之前运行。

我是否误解了 async/await 的工作方式?任何建议表示赞赏。预先感谢!

其他一些可能有帮助的信息: 操作系统:Windows 11 框架:NextJS 13(测试版),启用应用程序目录 IDE:WebStorm 我正在使用 Postman 来测试 api 路由调用。

代码

const {google} = require('googleapis')

const service = google.youtube('v3');
export async function GET() {
    const res = await getPlaylistData()
    // console.log(res.status);
    return new Response("Success", {
        status:200
    })
}

async function getPlaylistData() {
    const dataRes = await service.playlistItems.list({
        auth: process.env.API_KEY,
        part: "snippet,contentDetails,status",
        playlistId: process.env.UPLOADS_ID,
    }, function(err:any, res:any) {
        if (err) {
            console.log("The API returned an error: " + err);
            return;
        }
        let playlistItems = res.data.items;
        if (playlistItems.length == 0) {
            console.log("No playlistItems found");
        } else {
            console.log('This channel\'s latest video is: ' + playlistItems[0].snippet.title)
            console.log(typeof(playlistItems))
        }
    })
    return dataRes;
}
next.js routes async-await
1个回答
0
投票

从 getPlaylistData 函数返回 Promise 有效。

async function getPlaylistData() {
    return new Promise((resolve, reject) => {
        service.playlistItems.list({
            auth: process.env.API_KEY,
            part: "snippet,contentDetails,status",
            playlistId: process.env.UPLOADS_ID,
        }, async function(err:any, res:any) {
            if (err) {
                console.log("The API returned an error: " + err);
                return;
            }
            let playlistItems = res.data.items;
            if (playlistItems.length == 0) {
                console.log("No playlistItems found");
            } else {
                console.log('This channel\'s latest video is: ' + playlistItems[0].snippet.title)
                // console.log(playlistItems)
            }
            console.log(typeof(res))
            resolve(res)
        })
    })
}
© www.soinside.com 2019 - 2024. All rights reserved.