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

生产环境下Express CORS服务器无法向客户端发送Cookie的问题求助

生产环境下Express CORS服务器无法向客户端发送Cookie的问题求助

各位大佬好,我遇到一个头疼的问题:本地开发环境中,我的服务器(localhost:5000)可以正常向客户端(localhost:5173)发送Cookie,但部署到生产环境后,服务器(https://task-x-server.onrender.com)没法给客户端(https://task-x-1.vercel.app)传递Cookie了。

我的技术栈是:客户端用ReactJS + Axios发起请求,服务端用Express + Passport做认证。本地环境下客户端能正常收到Cookie,但生产构建后完全收不到。

下面是我服务端和客户端相关的配置代码,麻烦帮忙看看哪里出问题了:


服务端代码

index.ts(主入口配置)

import cors from "cors";
import helmet from "helmet";
import getCookies from "./middlewares/getCookies";
import bodyParser from "body-parser";

app.use(helmet({ crossOriginResourcePolicy: { policy: "cross-origin" } }));
app.use(cors({ origin: clientUrl, credentials: true }));
app.use(bodyParser.json());
app.use(getCookies);

googleAuthRoutes(app);

getCookies.ts(解析Cookie的中间件)

import { NextFunction, Request, Response } from "express";

const getCookies = (req: Request, res: Response, next: NextFunction) => {
  const cookies = req.headers.cookie;

  if (cookies) {
    const values = cookies.split(";").reduce((res, item) => {
      const data = item.trim().split("=");
      return { ...res, [data[0] as string]: data[1] };
    }, {});
    req.cookies = values;
  }

  next();
};

export default getCookies;

requireJwt.ts(验证Cookie中JWT的中间件)

import { NextFunction, Request, Response } from "express";
import jwt, { JwtPayload } from "jsonwebtoken";
import keys from "../config/keys";
import types from "../types/express";

export const requireJwt = (req: Request, res: Response, next: NextFunction) => {
  const { token } = req.cookies;
  const { jwtSecret, clientUrl } = keys;

  try {
    const { user } = jwt.verify(token, jwtSecret) as JwtPayload;
    req.user = user;
    next();
  } catch (err) {
    res.clearCookie("token");
    res.status(401).send({ error: "You must be logged in" });
    res.redirect(clientUrl);
  }
};

export default requireJwt;

authRoutes.ts(认证路由:设置Cookie和验证用户)

import passport from "passport";
import { Express, Request, Response } from "express";
import requireJwt from "../middlewares/requireJwt";
import jwt from "jsonwebtoken";
import dayjs from "dayjs";
import keys from "../config/keys";
const { jwtSecret, clientUrl } = keys;

const googleAuthRoutes = (app: Express) => {
  app.get(
    "/auth/google/callback",
    passport.authenticate("google", {
      session: false,
    }),
    (req, res) => {
      const { user } = req;
      const token = jwt.sign({ user }, jwtSecret, {
        expiresIn: "1d",
      });

      res.cookie("token", token, {
        secure: process.env.NODE_ENV !== "development",
        httpOnly: true,
        sameSite: "none",
        expires: dayjs().add(1, "day").toDate(),
      });

      res.redirect(`${clientUrl}/setup`);
    }
  );

  app.get("/api/current_user", requireJwt, (req, res) => {
    res.send(req.user);
  });
};

客户端代码

api/index.ts(Axios配置)

import axios, { AxiosRequestConfig } from "axios";
import keys from "../config/keys";

axios.defaults.baseURL = keys.server;

export const axiosFetchUser = async () => {
  const { data } = await axios.get(`/api/current_user`, {
    withCredentials: true,
  });
  return data;
};

App.tsx(调用用户接口的组件)

import { ReactElement, useEffect, useState } from "react";
import Landing from "./landing/Landing";
import ProfileSetup from "./profile/profile-setup/ProfileSetup";
import { useDispatch } from "react-redux";
import { AppThunkDispatch } from "./types";

const App = (): ReactElement => {
  const dispatch = useDispatch<AppThunkDispatch>();
  const [user, setUser] = useState();

  useEffect(() => {
    const fetchUser = async () => {
      try {
        const userData = await axiosFetchUser();
        setUser(userData);
      } catch (err) {
        console.error("Failed to fetch user:", err);
      }
    };
    fetchUser();
  }, []);

  return (
    <Routes>
      <Route path="/" element={<Landing />} />
      <Route path="/setup" element={<ProfileSetup />} />
    </Routes>
  );
};

麻烦各位帮忙排查一下,生产环境下Cookie无法传递的原因可能是什么?谢谢大家!

备注:内容来源于stack exchange,提问作者userWantsToCode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 11:24:51