Nestjs Websocket 服务器上有 2 个与 2 个独立 Redis 实例的打开连接,出现连接错误

问题描述 投票:0回答:1

我一直在修改这个聊天应用程序项目,我刚开始,但在连接到 2 个单独的 Redis 实例时遇到了一些麻烦。请注意,如果这是愚蠢的并且不是一个好的举动,请随时告诉我。

所以最初我有一个 Redis 实例为我的 Socket.IO 服务器处理 Pub/Sub,我在这里使用这个问题作为示例。

然后我想添加另一个 Redis 实例作为元数据的缓存/临时数据库,但是当我添加该代码并运行它时,我收到此错误。

错误:Redis 已连接/已连接

从这个错误中,我想我无法打开到 2 个不同服务器的两个单独连接?或者我可能做错了?

有没有办法可以正确配置它以与 2 个不同的服务器建立 2 个开放连接?

RedisClientFactory代码:(这连接到Redis数据库实例,端口6380)

此代码在 RedisModule 中调用/执行,然后在 AppModule 中调用/执行。

import { FactoryProvider } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import Redis from 'ioredis';

export const redisClientFactory: FactoryProvider<Redis> = {
  provide: 'RedisClient',
  useFactory: (configService: ConfigService) => {
    const redisInstance = new Redis({
      port: configService.get('REDIS_DB_PORT'),
      host: configService.get('REDIS_DB_HOST')
    });

    redisInstance.on('error', (e) => {
      throw new Error(`Redis connection failed: ${e}`);
    });

    return redisInstance;
  },
  inject: [ConfigService]
};

RedisIOAdapter 代码:(这连接到另一个实例,pub/sub,端口 6379) 此代码在 main.ts 引导方法中被调用/执行。

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.connect(); // <------
    subClient.connect(); // <------

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

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

    server.adapter(this.redisAdapter);

    return server;
  }
}
node.js redis socket.io nestjs
1个回答
0
投票

经过更多尝试后,我相信这是一个库限制,因为一旦我将库切换到

node-redis
,它似乎就可以正常工作。

总结一下,如果您需要一次打开多个不同的 Redis 连接,那么应使用

node-redis
作为客户端库,而不是
ioredis

代码更改:

const client = createClient({
   socket: {
      host,
      port
   }
});
© www.soinside.com 2019 - 2024. All rights reserved.