redis - NestJS 微服务 - Redis - 未连接
问题描述
我正在测试使用 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 {}
任务服务.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),其中包含以下内容:
主要的.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();
任务解析器.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 上测试它时,它永远不会从请求中返回响应。
解决方案
您需要将 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;
}
推荐阅读
- laravel - PHP / Laravel 8.0:从版本 7.25 升级后,Paginator 实例上的链接方法 UI 损坏
- mysql - Nodejs - 无法在mysql2中加载环境变量
- spring-boot - 在 SpringBoot @Scheduled 中更新 Cron 表达式运行时
- php - 通过jquery从模态窗体窗口获取复选框值的值
- cortex-m - 关于 Cortex-M3 bit-banding 功能的一些问题
- google-apps-script - 从谷歌表格创建日历事件
- python - 使用卷积来导出图像边缘上的错误结果
- flutter - 如何在没有 android studio 模拟器的情况下在 VSCode 中运行颤振应用程序
- php - 如何在php中使用firebase发送带有图像和徽章的推送通知?
- python - python子进程通配符仅选择第一个文件