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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:25:23