【问题标题】:NestJS RedisIoAdapter is not assignable to parameter of type WebSocketAdapter<any, any, any>NestJS RedisIoAdapter 不可分配给 WebSocketAdapter<any, any, any> 类型的参数
【发布时间】:2021-06-10 15:16:08
【问题描述】:

首先,抱歉语法错误,英语不是我的母语。

我只是想将 Redis 与 NestJS 一起使用,并为它创建了一个适配器。如果我说我直接从 NestJS 自己的示例中获取代码会更合适。这是我的 Redis 客户端:

import Redis from "ioredis";
import { CONFIG } from "src/config";

export const redis = new Redis(CONFIG.REDIS_URL);

这是适配器:

import { IoAdapter } from "@nestjs/platform-socket.io";
import { createAdapter } from "socket.io-redis";
import { redis } from "./redis";
import { ServerOptions } from "socket.io";

export class RedisIoAdapter extends IoAdapter {
    createIOServer(port: number, options?: ServerOptions): any {
        const server = super.createIOServer(port, options);
        const pubClient = redis;
        const subClient = redis.duplicate();
        const redisAdapter = createAdapter({
            pubClient,
            subClient,
        });
        server.adapter(redisAdapter);
        return server;
    }
}

但是当我尝试在我的应用程序上使用它时,它会说

app.useWebSocketAdapter(new RedisIoAdapter(app));
Argument of type 'RedisIoAdapter' is not assignable to parameter of type 'WebSocketAdapter<any, any, any>'. Type 'RedisIoAdapter' is missing the following properties from type 'WebSocketAdapter<any, any, any>': bindClientConnect, close

感谢您的所有帮助:3

【问题讨论】:

    标签: javascript typescript redis socket.io nestjs


    【解决方案1】:

    一个问题可能是因为没有安装@nestjs/websockets。 请确保你已经安装了@nestjs/websockets npm 包。

    【讨论】:

    • 我确定我完全下载了所有必要的包。
    【解决方案2】:

    这是我定义RedisIoAdapter 类的方式。

    import { RedisClient } from 'redis';
    import { ServerOptions } from 'socket.io';
    import { createAdapter } from 'socket.io-redis';
    import { IoAdapter } from '@nestjs/platform-socket.io';
    
    const pubClient = new RedisClient({
      host: process.env.REDIS_HOST,
      port: process.env.REDIS_PORT
    });
    const subClient = pubClient.duplicate();
    const redisAdapter = createAdapter({ pubClient, subClient });
    
    export class RedisIoAdapter extends IoAdapter {
      createIOServer(port: number, options?: ServerOptions): any {
        const server = super.createIOServer(port, options);
        server.adapter(redisAdapter);
        return server;
      }
    }

    main.ts 中,我包含了以下方式:

    import { RedisIoAdapter } from './common/redis-adapter';
    
    ...
    async function bootstrap() {
       const app = await NestFactory.create<NestExpressApplication>(AppModule);
       // Uses Redis Adapter
       app.useWebSocketAdapter(new 
       RedisIoAdapter((<any>app).getHttpServer()));
       ...
    }
    
    // Starting App now
    bootstrap();

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 1970-01-01
      • 2021-12-03
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 2020-03-19
      • 2018-04-23
      相关资源
      最近更新 更多