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

使用Spotify API时,POST /spotifylogin路由出现连接拒绝错误

问题描述

我在音乐播放器项目中使用Spotify API,每次登录后重定向到/spotifylogin路由时,控制台都会报错:POST http://localhost:3001/spotifylogin net::ERR_CONNECTION_REFUSED。
错误截图

server.js 代码

// ==== [Cors] ====
app.use(cors());
const server = http.createServer(app);

//==== [Spotify] ====

app.use(bodyParser.json());

app.post("/spotifylogin", (req, res) => {
  const spotifyApi = new SpotifyWebApi({
    redirectUri: "http://localhost:3000/",
    clientId: "d67a6de2b2f045539acfef33cdff8840",
    clientSecret: "bd98e8446154499ab7eef56762cd16f2",
  });

  spotifyApi
    .authorizationCodeGrant(code)
    .then((data) => {
      res.json({
        accessToken: data.body.access_token,
        refreshToken: data.body.refresh_token,
        expiresIn: data.body.expires_in,
      });
    })
    .catch((err) => {
      console.log(err);
      res.sendStatus(400);
    });

  app.listen(3001);
});

auth.jsx 代码

import { useState, useEffect } from "react";
import axios from "axios";

export default function spotifyAuth(code) {
  const [accessToken, setAccessToken] = useState();
  const [refreshToken, setRefreshToken] = useState();
  const [expiresIn, setExpiresIn] = useState();

  useEffect(() => {
    axios
      .post("http://localhost:3001/spotifylogin", { code })
      .then((res) => {
        console.log(res.data);
        setAccessToken(res.data.accessToken);
        setRefreshToken(res.data.refreshToken);
        setExpiresIn(res.data.expiresIn);
        window.history.pushStage({}, null, "/");
      })
      .catch((err) => {
        console.log(err);
      });
  }, [code]);
  return accessToken;
}

我尝试过调整CORS跨域配置,也试过通过Vite配置代理,但都没有效果。(注:我是编程新手)


问题排查与修复方案

1. 核心问题:服务器启动位置错误

你把app.listen(3001)写在了/spotifylogin的POST路由处理函数内部,这意味着只有当这个接口被调用时才会启动服务器,但此时前端已经在请求接口了,服务器根本没启动,自然会报连接拒绝错误。

修复方法:把启动代码移到路由定义的外面,放在代码最底部:

// ==== [Cors] ====
app.use(cors());
const server = http.createServer(app);

//==== [Spotify] ====

app.use(bodyParser.json());

app.post("/spotifylogin", (req, res) => {
  // 原有的路由处理代码不变
});

// 把启动代码移到这里!
app.listen(3001, () => {
  console.log("服务器在3001端口启动成功");
});

2. 未获取请求中的code参数

路由里直接用了code变量,但这个code是前端通过POST请求传过来的,必须从req.body里读取:

// 替换原来的spotifyApi.authorizationCodeGrant(code)
spotifyApi.authorizationCodeGrant(req.body.code)

3. 前端路由跳转方法拼写错误

前端代码里的window.history.pushStage是笔误,正确方法是window.history.pushState:

window.history.pushState({}, null, "/");

4. 额外操作提示

修改完代码后,先运行node server.js启动后端服务器,看到控制台输出启动成功的提示后,再启动前端项目,确保前后端服务都正常运行再测试登录流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 01:24:55