Node.js中getMyData函数无法等待refreshSpotifyToken执行完成及定时刷新Spotify访问令牌问题
解决Spotify令牌刷新的异步等待与定时更新问题
我刚看完你的代码,马上就能发现两个核心问题导致你遇到的麻烦,咱们一步步来修复:
问题分析
1. 异步等待失效的根源
你的refreshSpotifyToken函数虽然标了async,但内部用的是回调函数而非Promise,这就导致await refreshSpotifyToken()根本不会等待令牌刷新完成就继续执行后续代码。另外还有个小错误:spotifyApi.setAccessToken是个方法,不是属性,你应该调用它而不是直接赋值。
2. 定时刷新的时间错误
你写的30*30*1000其实是15分钟(30秒×30),而你需要的是30分钟,正确的毫秒数应该是30*60*1000。
修正后的完整代码
var spotifyWebApiNode = require('spotify-web-api-node') const spotifyApi = new spotifyWebApiNode(); var refresh = require('spotify-refresh') // 建议把这些敏感信息放到环境变量里,不要硬编码! const refreshToken = '<refresh token>'; const clientID = '<client id>'; const clientSecret = '<client secret>'; // 把回调包装成Promise,让await能正常工作 async function refreshSpotifyToken(){ return new Promise((resolve, reject) => { refresh(refreshToken, clientID, clientSecret, function (err, res, body) { if (err) { console.error('刷新令牌失败:', err); return reject(err); } // 正确调用setAccessToken方法 spotifyApi.setAccessToken(body.access_token); console.log('Spotify Access Token Successfully Refreshed'); resolve(body.access_token); }) }) } // 修正定时刷新的时间为30分钟 setInterval(async () => { try { await refreshSpotifyToken(); } catch (err) { console.error('定时刷新令牌出错:', err); } }, 30*60*1000) async function getMyData(){ try { // 现在await会真正等待令牌刷新完成 await refreshSpotifyToken(); const data = await spotifyApi.getMe(); const userId = data.body.id; // 如果getMyPlaylist是异步函数,记得加await await getMyPlaylist(userId); } catch (err) { console.error('获取用户数据失败:', err); } } async function getMyPlaylist(userId){ // 这里写你的播放列表逻辑,记得处理异步操作 try { const playlists = await spotifyApi.getUserPlaylists(userId); console.log('用户播放列表:', playlists.body); } catch (err) { console.error('获取播放列表失败:', err); } }
额外优化建议
- 敏感信息管理:把
refreshToken、clientID、clientSecret放到环境变量里(比如用process.env.SPOTIFY_REFRESH_TOKEN),不要硬编码在代码里,避免泄露。 - 错误处理:给所有异步操作加上
try/catch,这样能及时捕获并处理错误,避免程序静默崩溃。 - 令牌刷新的幂等性:可以考虑加个锁机制,比如用一个布尔变量标记是否正在刷新,避免在令牌正在刷新的时候重复调用
refreshSpotifyToken。
内容的提问来源于stack exchange,提问作者questiontoansw
相关产品推荐
相关产品推荐

