You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:07:42