NestJS 结合 gRPC 调用认证微服务返回空对象问题求助
问题核心原因
NestJS gRPC客户端调用返回的是RxJS Observable对象,HTTP接口直接返回该对象时无法被正确序列化,就会得到空响应。
解决步骤
- 网关层将Observable转为Promise
从rxjs导入lastValueFrom方法包裹gRPC调用即可,修改后的网关代码如下:
// 顶部新增导入 import { lastValueFrom } from 'rxjs'; import { Body, Controller, OnModuleInit, Post } from '@nestjs/common'; import { Client, ClientGrpc } from '@nestjs/microservices'; import { authOptions } from 'src/grpc.options'; import { AuthService } from './grpc.interface'; @Controller('auth') export class AuthController implements OnModuleInit { @Client(authOptions) private client: ClientGrpc; private authService: AuthService; onModuleInit() { this.authService = this.client.getService<AuthService>('AuthService'); } @Post('login') async login(@Body('username') username: string, @Body('password') password: string) { // 用lastValueFrom包裹gRPC调用 return lastValueFrom(this.authService.login({ username, password })); } }
- 检查以下容易遗漏的配置:
- 确认你的
authOptions配置中package字段值为auth,和proto文件的package auth声明完全一致 - 确认认证微服务启动时,已经正确注册了gRPC微服务配置,加载了对应proto文件
- 确认网关侧定义的
AuthServiceTS接口中,返回字段和proto定义的LoginReturn完全匹配,不要把access_token误写为驼峰格式accessToken - 确认认证微服务的
AuthController已经被注册到对应模块的controllers数组中
内容的提问来源于stack exchange,提问作者Jur Dekker
相关产品推荐
相关产品推荐

