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

NestJS WebSocket服务器连接两个Redis实例报错求助

解决Redis同时连接两个实例的错误问题

出现Error: Redis is already connecting/connected的核心原因是ioredis v4+版本默认会自动建立连接,你在RedisIoAdapter中手动调用pubClient.connect()和subClient.connect(),触发了重复连接的检测逻辑。以下是修复步骤:

1. 移除手动连接调用

直接删除RedisIoAdapter构造函数中的这两行代码:

pubClient.connect(); // 删掉这行
subClient.connect(); // 删掉这行

ioredis实例在创建后会自动发起连接,不需要手动调用connect(),重复调用就会抛出上述错误。

2. 确保两个Redis实例配置独立

检查你的环境变量配置,确认:

  • REDIS_DB_HOST/REDIS_DB_PORT指向元数据缓存用的Redis(6380端口)
  • REDIS_IO_PORT配合对应的host指向Socket.IO Pub/Sub用的Redis(6379端口)
    两个实例的配置完全隔离,不会互相干扰。

3. 补充错误监听(可选但推荐)

给Socket.IO的Redis客户端添加错误监听,方便排查连接问题:

// 在RedisIoAdapter构造函数中添加
pubClient.on('error', (err) => {
  console.error('Socket.IO Redis发布客户端错误:', err);
});
subClient.on('error', (err) => {
  console.error('Socket.IO Redis订阅客户端错误:', err);
});

修复后的RedisIoAdapter代码示例

import { IoAdapter } from '@nestjs/platform-socket.io';
import { createAdapter } from '@socket.io/redis-adapter';
import { Redis } from 'ioredis';
import { Server, ServerOptions } from 'socket.io';
import * as util from '../shared/util';

import { INestApplicationContext } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

const host = util.isLocal() ? 'localhost' : 'redis';

export class RedisIoAdapter extends IoAdapter {
  protected redisAdapter;

  constructor(private app: INestApplicationContext) {
    super(app);
    const configService = this.app.get(ConfigService);
    const port: string = configService.get('REDIS_IO_PORT') || '';
    if (!port || port.length <= 0 || !host) {
      throw Error('Issue creating the Redis URL');
    }
    const pubClient = new Redis({
      host,
      port: Number(port)
    });
    const subClient = pubClient.duplicate();

    // 添加错误监听
    pubClient.on('error', (err) => {
      console.error('Socket.IO Redis发布客户端错误:', err);
    });
    subClient.on('error', (err) => {
      console.error('Socket.IO Redis订阅客户端错误:', err);
    });

    this.redisAdapter = createAdapter(pubClient, subClient);
  }

  createIOServer(port: number, options?: ServerOptions) {
    const server = super.createIOServer(port, options) as Server;

    server.adapter(this.redisAdapter);

    return server;
  }
}

关键说明

两个不同的Redis实例完全可以同时连接,只要每个实例的配置(host、端口、密码等)正确,且避免重复调用连接方法。你的RedisClientFactory代码没有问题,它创建的是独立的Redis实例,和Socket.IO用的实例互不影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:23:18