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

Node中Axios调用Spotify API请求挂起无报错的排查求助

解决Spotify API请求挂起无响应的问题

嘿,我看了你的代码和问题描述,请求挂起、没报错也没响应的核心问题出在异步代码的错误处理逻辑不完整,还有几个代码细节需要调整,咱们一步步来解决:

首先分析代码里的关键问题

  1. try/catch抓不到异步错误:你用try包裹了axios.get,但axios.get返回的是Promise,没有加await的话,这行代码是同步执行的,只会返回一个未完成的Promise,异步请求的错误根本进不了这个catch块——这就是为什么之前的ECONNRESET错误消失后,连报错都看不到了。
  2. Promise链没处理拒绝状态:playlistData.then()后面没有跟.catch(),如果请求失败(比如网络卡住、授权无效),Promise会进入拒绝状态但没人处理,就会导致请求一直挂着,控制台也没输出。
  3. 函数没返回Promise:你的tryFetchForPlaylists函数最后没有返回整个Promise链,调用这个函数的地方也没法等待它完成,看起来就像请求没动静。

修正后的代码(用async/await更直观)

async function tryFetchForPlaylists(usersCred) { 
  console.log('req method called ', usersCred);
  try { 
    // 用await等待请求完成,让try/catch能捕获异步错误
    const response = await axios.get(`https://api.spotify.com/v1/users/${usersCred.userId}/playlists`, { 
      headers: { 
        'Authorization': `Bearer ${usersCred.accessToken}`
        // 注意:GET请求不需要Content-Type头,去掉避免不必要的干扰
      } 
    });
    console.info('response status', response.status);
    if (response.status === 200) { 
      return response; 
    }
  } catch (err) { 
    console.error('请求出错:', err);
    // 用可选链?.避免请求完全无响应时,err.response为undefined导致报错
    if (err.response?.status === 401) { 
      console.error('授权失效,请重新获取access token');
      return {statusCode: 401}; 
    }
    // 处理网络挂起这类无响应的情况
    console.error('请求挂起或网络异常:', err.message);
    return {statusCode: 500, error: err.message};
  }
}

关键修改点说明

  • 把函数改成async,用await等待axios请求完成,这样try/catch就能正确捕获所有异步错误(包括网络挂起、超时这类问题)
  • 用模板字符串替换字符串拼接,代码更简洁易读
  • 去掉了GET请求不需要的Content-Type头(Spotify的GET接口不需要这个,多余的头可能触发不必要的校验)
  • 给err.response加了可选链?.,避免当请求完全没收到响应时(比如网络断了),出现Cannot read property 'status' of undefined的报错
  • 在catch块里覆盖了所有错误场景,不管是授权错误还是网络挂起,都会输出日志并返回明确的状态码
  • 函数始终返回一个值,调用方可以通过await tryFetchForPlaylists(yourCred)来获取结果,不会出现无响应的情况

如果修改后还是挂起?

那大概率是网络层面的问题,可以用curl命令先测试下:

curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" https://api.spotify.com/v1/users/YOUR_USER_ID/playlists
  • 如果curl也挂起:说明你的网络到Spotify API的连接有问题,检查代理、防火墙,或者切换网络试试
  • 如果curl能正常返回:那可能是Node环境的网络配置问题,比如Node的代理设置、SSL证书验证问题,可以试试在axios里临时禁用SSL验证(仅测试用,生产环境不建议):
    const https = require('https');
    axios.get(url, {
      httpsAgent: new https.Agent({ rejectUnauthorized: false })
    })
    

内容的提问来源于stack exchange,提问作者godhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:47:18