NestJS RedisIoAdapter 不可分配给 WebSocketAdapter 类型的参数<any, any, any>

NestJS RedisIoAdapter is not assignable to parameter of type WebSocketAdapter<any, any, any>

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

我只是想将 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

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

我是这样定义的 RedisIoAdapter class.

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();