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

生产环境跨域WebSocket连接失败(前后端部署在Vercel)

Vercel部署Socket.IO无法建立WebSocket连接的解决方案

Vercel的普通Serverless Functions不支持WebSocket长连接,这是问题的核心原因——Serverless函数是按需启动、短生命周期的,没法维持WebSocket需要的持久连接。下面是针对性的解决办法:


方案1:改用Vercel Edge Functions部署Socket.IO服务

Edge Functions支持WebSocket,适合部署实时通信服务。修改服务端代码适配Edge Runtime:

// app/api/socket/route.ts
import { Server } from "socket.io";

export const runtime = "edge"; // 指定使用Edge Runtime

export async function POST(req: Request) {
  const { socket, response } = await Server.createSocketHandler(req, {
    cors: {
      origin: "https://chattin.vercel.app",
      methods: ["GET", "POST"],
      credentials: true
    }
  });

  socket.on("connection", (client) => {
    // 自定义业务逻辑示例
    client.on("message", (data) => {
      client.broadcast.emit("message", data);
    });
  });

  return response;
}

客户端连接时调整路径到Edge Functions的路由:

import { io } from "socket.io-client";
const socket = io("https://chat-app-bice-ten.vercel.app", {
  path: "/api/socket", // 对应Edge Functions的路由路径
  transports: ["websocket", "polling"] // 允许自动降级
});
export default socket;

方案2:保留Serverless Functions,改用Polling传输

如果暂时不想切换到Edge Functions,可以让Socket.IO降级到HTTP Polling(实时性略差,但能在Vercel Serverless上运行):

修改客户端代码,移除强制websocket传输:

import { io } from "socket.io-client";
const socket = io("https://chat-app-bice-ten.vercel.app", {
  transports: ["polling", "websocket"], // 优先用polling,自动尝试升级
  withCredentials: true
});
export default socket;

同时更新服务端CORS配置,允许credentials:

const io = socketIo(server, {
  cors: {
    origin: "https://chattin.vercel.app",
    credentials: true,
    methods: ["GET", "POST"]
  },
});

额外检查项

  • 确认Vercel项目部署日志无报错,服务端代码已正确打包部署
  • 检查前端域名是否添加到Vercel项目的CORS白名单(项目设置→Security→CORS)
  • 验证Socket.IO前后端版本一致,避免版本不兼容导致连接失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:19:55