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

Node.js集成Socket.IO Redis Adapter时遇TypeError问题求助

解决Socket.IO集成Redis Adapter时的TypeError问题

在Node.js应用中集成ioredis实现Socket.IO事件广播时,出现以下错误:

TypeError: Class extends value undefined is not a constructor or null

错误指向class ShardedRedisAdapter extends socket_io_adapter_1.ClusterAdapter代码行。以下是问题排查及解决方案:

问题原因

该错误主要由两个核心因素导致:

  • Socket.IO与@socket.io/redis-adapter版本不兼容,导致ClusterAdapter未被正确导出或不存在
  • Docker容器内应用尝试用localhost连接Redis,无法访问容器网络中的Redis服务

解决方案

1. 统一依赖版本兼容性

确保socket.io和@socket.io/redis-adapter版本匹配:

  • @socket.io/redis-adapter v8.x 对应 Socket.IO v4.x
  • @socket.io/redis-adapter v2.x 对应 Socket.IO v3.x

更新package.json中的依赖示例:

{
  "dependencies": {
    "socket.io": "^4.7.2",
    "@socket.io/redis-adapter": "^8.2.1",
    "ioredis": "^5.3.2"
  }
}

执行npm install更新依赖。

2. 修正Redis连接配置

在Docker容器环境中,应用不能用localhost访问Redis服务,需使用Docker Compose中定义的服务名redis作为主机地址。同时推荐用duplicate()创建订阅客户端,避免重复初始化连接:

修改应用代码中的Redis连接部分:

const pubClient = new Redis({
  host: "redis", // 替换localhost为Docker服务名
  port: 6379,
  password: process.env.REDIS_PASSWORD,
});

// 使用duplicate创建订阅客户端,共享连接配置
const subClient = pubClient.duplicate();

// 监听Redis连接错误
pubClient.on("error", (err) => console.error("Redis发布客户端错误:", err));
subClient.on("error", (err) => console.error("Redis订阅客户端错误:", err));

3. 修正Docker Compose配置错误

Docker Compose中server服务的args语法错误,需将冒号改为等号:

server:
  image: server-dev
  build:
    context: .
    target: server-dev
    args:
      - PORT=${PORT} # 原写法PORT:${PORT}改为PORT=${PORT}

4. 验证Adapter初始化

确保createAdapter正确传入客户端实例,并且在Socket.IO初始化时正确配置:

const io = new Server(httpServer, {
  adapter: createAdapter(pubClient, subClient),
});

测试验证

  1. 重启Docker容器:docker-compose down && docker-compose up -d
  2. 查看应用日志:docker logs server-dev,确认无错误信息
  3. 连接Socket.IO服务,测试事件广播功能

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:52:36