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

Next.js生产构建中Microsoft Signal R无法建立连接的问题

Next.js生产环境SignalR协商URL错误解决方案

问题分析

生产构建(yarn build)后,SignalR初始化时协商请求URL被错误替换为当前组件路径(如http://localhost:3000/register/pre-fetch?negotiateVersion=1),而非预期的https://{{SignalrURL}}/negotiate?negotiateVersion=1,但开发环境(yarn dev)运行正常。核心原因是客户端代码中SignalR的Hub URL未使用绝对路径,或环境变量未正确注入生产构建流程。

解决步骤

1. 配置Next.js客户端可访问的环境变量

Next.js中,客户端代码能读取的环境变量必须以NEXT_PUBLIC_为前缀。在项目根目录创建/修改.env.production文件:

NEXT_PUBLIC_SIGNALR_URL=https://你的实际SignalR服务完整地址

2. 修改SignalR连接代码

更新signal.ts,用环境变量确保使用绝对路径:

import * as signalR from '@microsoft/signalr';

const signalrUrl = process.env.NEXT_PUBLIC_SIGNALR_URL;
if (!signalrUrl) {
  throw new Error('SignalR服务地址未配置');
}

const conn = new signalR.HubConnectionBuilder()
  .withUrl(signalrUrl, {
    accessTokenFactory: () => localStorage.getItem('token')
  })
  .withAutomaticReconnect()
  .configureLogging(signalR.LogLevel.Debug)
  .build()
  .start();

3. 验证生产构建时环境变量注入

  • 本地测试生产构建:终端直接注入变量执行构建
NEXT_PUBLIC_SIGNALR_URL=https://你的实际地址 yarn build && yarn start
  • CI/CD环境中,需在流水线配置中添加NEXT_PUBLIC_SIGNALR_URL环境变量

4. 排查路由/代理干扰

检查next.config.js中的rewrites或headers配置,确保未对SignalR协商请求路径错误重写。若有代理规则,需排除SignalR相关路径:

// next.config.js示例:排除SignalR路径
module.exports = {
  async rewrites() {
    return [
      {
        source: '/api/:path*',
        destination: 'https://你的API地址/api/:path*',
      },
      // 确保SignalR协商请求不被代理
      {
        source: '/negotiate',
        destination: `${process.env.NEXT_PUBLIC_SIGNALR_URL}/negotiate`,
      },
    ];
  },
};

额外注意事项

  • 确保SignalR服务端配置了正确的CORS规则,允许你的Next.js生产域名跨域访问
  • 确认@microsoft/signalr客户端版本与服务端版本兼容(当前使用v7.0.0,需对应服务端版本)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:05:41