【问题标题】:NestJS Microservice - Redis - Not ConnectingNestJS 微服务 - Redis - 未连接
【发布时间】:2020-05-09 15:10:01
【问题描述】:

我正在测试使用 NestJS 和使用 Redis 的微服务。我已经按照文档的建议设置了代码,但是当我从客户端发送消息模式时,我的微服务没有被触发。

我的客户端是一个 GraphQL NestJS API,我想将所有请求集中到它。

Main.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.listen(3000);
}
bootstrap();

app.module.ts

const REDIS_HOST = process.env.REDIS_HOST || 'localhost';
const REDIS_PORT = process.env.REDIS_PORT || 6379;

@Module({
  imports: [
    GraphQLModule.forRoot({
      autoSchemaFile: 'schema.gql',
      installSubscriptionHandlers: true,
      context: ({ req }) => {
        return {
          req
        }
      }
    }),
    TasksModule,
    TypeOrmModule.forRoot(typeOrmConfig),
    AuthModule,
    ClientsModule.register([{ name: 'TASK_SERVICE', transport: Transport.REDIS, options: { url: `redis://${REDIS_HOST}:${REDIS_PORT}` }}]),
  ]
})
export class AppModule {}

task.service.ts

@Injectable()
export class TaskService {
    constructor(
        @Inject('TASK_SERVICE') private readonly client: ClientProxy
    ) { }

    async onModuleInit() {
        // Connect your client to the redis server on startup.
        await this.client.connect();
      }


    public async findAll() {
        const response = await this.client.send(
            { type: 'get-tasks' },
            { someImaginaryParams: 42 }
        ).toPromise();
        return response;
    }
}

然后我创建了一个微服务 API(也使用 GraphQL),其中包含以下内容:

ma​​in.ts

const REDIS_HOST = process.env.REDIS_HOST || '127.0.0.1';
const REDIS_PORT = process.env.REDIS_PORT || 6379;

const logger = new Logger('Main');

const microserviceOptions = {
  transport: Transport.REDIS,
  options: {
    url: `redis://${REDIS_HOST}:${REDIS_PORT}`
  }
}

async function bootstrap() {
  const app = await NestFactory.createMicroservice(AppModule, microserviceOptions);
  app.listen(() => {
    logger.log(`Microservice listening...`)
  });
}
bootstrap();

tasks.resolver.ts

@Resolver(of => TaskDto)
export class TaskResolver {
    constructor(
        private readonly taskService: TaskService
    ) { }

    @Query(() => [TaskDto])
    @MessagePattern({ type: 'get-tasks' })
    async tasks() {
        console.log('Tasks API Hit - tasks');
        return await this.taskService.findAll();
    }
}

因此,微服务中保存的 console.log 没有被命中,当我在 GraphIQL 上测试它时,它永远不会从请求中返回响应。

【问题讨论】:

    标签: redis graphql microservices nestjs


    【解决方案1】:

    您需要将 rxjs 库中的 Observable 返回类型应用于 task.service.ts 中的 findAll(),如下所示:

    public async findAll(): Observable<any> {
        const response = await this.client.send(
            { type: 'get-tasks' },
            { someImaginaryParams: 42 }
        ).pipe(timeout(5000));
        return response;
    }
    

    【讨论】:

      猜你喜欢
      • 2022-06-11
      • 2019-10-08
      • 2019-06-14
      • 2022-11-25
      • 1970-01-01
      • 2021-01-12
      • 2019-01-23
      • 2021-06-23
      • 2021-06-20
      相关资源
      最近更新 更多