近日部署了一个libretranslate服务,一个口碑不错开源机器翻译服务。就想着写个api去调用,于是参照nest.js 官方文档,开始了nest.js+axois入坑之旅。
yarn add @nestjs/axios axios
// translator.module.ts import { Module } from '@nestjs/common'; import { TranslatorService } from './translator.service'; import { TranslatorController } from './translator.controller'; import { HttpModule } from '@nestjs/axios'; @Module({ imports: [HttpModule], controllers: [TranslatorController], providers: [TranslatorService], }) export class TranslatorModule {}
// translator.service.ts translate(text: string): Observable<AxiosResponse<any>> { return this.http.post( this.configService.translateUrl, { q: text, // ... ohter params } ); }
调用api,报错如下:
[Nest] 2120 - 2024/08/31 16:10:16 ERROR [ExceptionsHandler] Converting circular structure to JSON --> starting at object with constructor 'ClientRequest' | property 'res' -> object with constructor 'IncomingMessage' --- property 'req' closes the circle TypeError: Converting circular structure to JSON
思考之下,原因也简单,httpService返回的是一个Observable,不能像Promise一样直接return, 即使.toPromise()
也报错依旧,调用.subscribe(res => res.data)
, 依然无法return出service。查询之后,发现Observable是基于rxjs,于是就有了将Observable最后的结果return的操作。
// translator.service.ts async translate(text: string) { const res = this.http.post( this.configService.translateUrl, { q: text, // ... } ); const checkResult: any = await lastValueFrom(res); return checkResult?.data; }
再次调用,完美输出。自此,坑被填,心已宽。