NestJS - 使用微服务获取文件流并使用 Observable return 到网关
NestJS - Using Microservice to fetch file stream and return to Gateway using Observable
目前我正在 nestjs 中构建一个 api 网关,它使用微服务(也在 nestjs 中)负责从远程服务器获取文件作为流。
查看 nestjs 文档,我找到了 class StreamableFile,但据我了解,这是直接在网关上使用。
我的微服务上的可读流已准备好 returned 到 api-gateway,但是这应该以块的形式发送到 api 网关,并且这个网关本身也会将这些块流式传输到前端。我不想在微服务或我的 api-gateway 中分配内存中的文件。
我的问题是要与微服务通信,我使用 ClientProxy,来自微服务的 return 必须是可观察的。
考虑到这一点,我一直在尝试以下操作但没有成功:
NestJS 微服务:
@MessagePattern('get_file_by_key')
getFileStreamByKey(
keyFileName : string,
): Observable<any> {
const stream = this.remoteServerService.getFile(keyFileName).createReadStream();
return from(stream);
}
NestJS 网关(微服务消费者)
@Get('/file')
public getFile(): StreamableFile {
return new StreamableFile(this.clientProxy.send('get_file_by_key', 'theFileName'));
}
以上只是陈述我对此的想法,因为代码甚至无法编译,因为 clientProxy 的发送方法 return 是一个可观察对象,我需要 StreamableFile 构造函数的流。
不寻求立即解决方案,但至少寻求一些关于如何实施并从中学习的指导。我需要在我的 nestjs 微服务上使用 gRPC 吗?
提前致谢
我发现的解决方案是使用额外的库将流转换为 rxjs 可观察的,然后在 rxjs 可观察的流中使用 npm 库 rxjs-stream。
目前我正在 nestjs 中构建一个 api 网关,它使用微服务(也在 nestjs 中)负责从远程服务器获取文件作为流。
查看 nestjs 文档,我找到了 class StreamableFile,但据我了解,这是直接在网关上使用。
我的微服务上的可读流已准备好 returned 到 api-gateway,但是这应该以块的形式发送到 api 网关,并且这个网关本身也会将这些块流式传输到前端。我不想在微服务或我的 api-gateway 中分配内存中的文件。
我的问题是要与微服务通信,我使用 ClientProxy,来自微服务的 return 必须是可观察的。
考虑到这一点,我一直在尝试以下操作但没有成功:
NestJS 微服务:
@MessagePattern('get_file_by_key')
getFileStreamByKey(
keyFileName : string,
): Observable<any> {
const stream = this.remoteServerService.getFile(keyFileName).createReadStream();
return from(stream);
}
NestJS 网关(微服务消费者)
@Get('/file')
public getFile(): StreamableFile {
return new StreamableFile(this.clientProxy.send('get_file_by_key', 'theFileName'));
}
以上只是陈述我对此的想法,因为代码甚至无法编译,因为 clientProxy 的发送方法 return 是一个可观察对象,我需要 StreamableFile 构造函数的流。
不寻求立即解决方案,但至少寻求一些关于如何实施并从中学习的指导。我需要在我的 nestjs 微服务上使用 gRPC 吗?
提前致谢
我发现的解决方案是使用额外的库将流转换为 rxjs 可观察的,然后在 rxjs 可观察的流中使用 npm 库 rxjs-stream。