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

Posted

技术标签:

【中文标题】NestJS RedisIoAdapter 不可分配给 WebSocketAdapter<any, any, any> 类型的参数【英文标题】:NestJS RedisIoAdapter is not assignable to parameter of type 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

【问题讨论】:

【参考方案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();

【讨论】:

以上是关于NestJS RedisIoAdapter 不可分配给 WebSocketAdapter<any, any, any> 类型的参数的主要内容,如果未能解决你的问题,请参考以下文章

NestJS Postgres Prisma - 错误类型'字符串'不可分配给参数类型'TemplateStringsArray | Sql'

使用 mongoose 和 nestjs 进行分页

TypeORM/NestJS 中的分页

ES2017 NEST JS @IsEmpty 在作为表达式调用时无法解析属性装饰器的签名。此表达式不可调用。不为空

打字稿错误:类型“文档 []”不可分配给自定义类型

R语言生成螺旋形(spirals)仿真数据实战:螺旋线型线性不可分数据集螺旋线型不可分数据集可视化为散点图中的每个数据点添加类标签信息