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
相关产品推荐
相关产品推荐

