NextJS API路由中await未生效问题排查求助
问题分析与解决方案
核心问题是你混用了回调函数和async/await两种异步处理模式,导致await没有正确等待YouTube API请求完成。
googleapis库的方法如果传入回调函数,会以传统回调模式执行,不会返回Promise,所以await service.playlistItems.list(...)得到的dataRes是undefined——这就是console.log(res.status)报错的原因。而回调里的代码会在请求完成后异步执行,这就造成了回调日志能输出,但await没拿到结果的假象。
修复方案
1. 改用Promise模式(移除回调)
googleapis的方法在不传入回调时会返回Promise,此时await可以正确等待请求完成:
const { google } = require('googleapis') const service = google.youtube('v3'); export async function GET() { try { const res = await getPlaylistData() console.log(res.status); // 现在可正常访问status return new Response("Success", { status: 200 }) } catch (err) { console.log("The API returned an error: " + err); return new Response("Error", { status: 500 }) } } async function getPlaylistData() { // 不传入回调,直接await返回的Promise const dataRes = await service.playlistItems.list({ auth: process.env.API_KEY, part: "snippet,contentDetails,status", playlistId: process.env.UPLOADS_ID, }) const playlistItems = dataRes.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; }
2. 统一错误处理
原来回调里的错误逻辑要改成try/catch捕获,这样能处理API请求中的所有异常,避免未处理的Promise rejection。
关键注意点
- 给googleapis方法传回调时,它会走回调模式,不返回Promise,
await无法等待其完成,直接得到undefined。 - 只有不传回调时,方法才返回Promise,
await才能正确拿到完整的响应对象。
内容的提问来源于stack exchange,提问作者ASK
相关产品推荐
相关产品推荐

