使用Express Fetch API获取Spotify精选播放列表时遇500内部服务器错误求助
排查Express调用Spotify API的500错误
你的代码里有几个关键问题导致了500内部服务器错误,逐一修复即可解决:
1. fetch 初始化方式错误
你当前的fetch是通过Promise异步获取的,直接调用会因为它是Promise而非函数抛出错误。根据你使用的node-fetch版本调整导入方式:
如果是node-fetch v2(CommonJS):
const fetch = require("node-fetch");
如果是node-fetch v3+(ESM):
import fetch from "node-fetch";
2. getSpotifyToken 未返回令牌数据
函数内部获取到jsonResponse后没有return,导致后续中间件中tokenData为undefined,判断tokenData.access_token时触发错误,直接返回500。
修复后的函数:
async function getSpotifyToken() { const response = await fetch(SPOTIFY_TOKEN_URL, { method: "POST", headers: { Authorization: "Basic " + Buffer.from(CLIENT_ID + ":" + CLIENT_SECRET).toString("base64"), "Content-Type": "application/x-www-form-urlencoded", }, body: "grant_type=client_credentials", // 移除多余的`json: true`,因为请求体已经是form-urlencoded格式 }); if (response.ok) { const jsonResponse = await response.json(); console.log(jsonResponse); return jsonResponse; // 必须返回令牌数据 } else { const errorDetails = await response.text(); console.log("令牌请求错误详情:", errorDetails); throw new Error( `请求失败!状态码: ${response.status} ${response.statusText}, 详情: ${errorDetails}` ); } }
3. Bearer 授权头缺少空格
Authorization: "Bearer" + accessToken中Bearer和令牌之间没有空格,Spotify API会判定授权无效,返回401错误,进而触发你的500捕获逻辑。
修复:
headers: { Authorization: "Bearer " + accessToken, // Bearer后添加空格 },
4. 中间件中未定义的变量
当令牌获取失败的分支里,res.status(tokenResponse.status)中的tokenResponse未定义,会抛出未捕获错误,导致500。
修复:
} else { console.error("获取Spotify令牌失败:", tokenData); res.status(400).json({ error: "获取Spotify访问令牌失败" }); }
可选优化:令牌缓存
每次请求都获取新令牌会浪费资源,建议缓存令牌直到过期:
let cachedToken = null; let tokenExpiryTime = 0; async function getSpotifyToken() { // 检查缓存令牌是否有效 if (cachedToken && Date.now() < tokenExpiryTime) { return cachedToken; } const response = await fetch(SPOTIFY_TOKEN_URL, { // 原请求配置... }); if (response.ok) { const jsonResponse = await response.json(); cachedToken = jsonResponse; // 设置过期时间(当前时间+有效期秒数-1秒缓冲) tokenExpiryTime = Date.now() + (jsonResponse.expires_in * 1000) - 1000; return jsonResponse; } else { // 错误处理... } }
内容的提问来源于stack exchange,提问作者LearningCoder
相关产品推荐
相关产品推荐

