NestJs 异步 httpService 调用

Posted

技术标签:

【中文标题】NestJs 异步 httpService 调用【英文标题】:NestJs async httpService call 【发布时间】:2019-01-25 09:53:59 【问题描述】:

如何使用 NestJs 在 HttpService 上使用 Async/Await? 下面的代码不起作用:

async create(data) 
    return await this.httpService.post(url, data);

【问题讨论】:

【参考方案1】:

HttpModule 使用 Observable 而不是 Promise,后者不适用于 async/await。所有HttpService 方法都返回Observable<AxiosResponse<T>>

因此,您可以将其转换为 Promise,然后在调用它时使用 await,或者只返回 Observable 并让调用者处理它。

create(data): Promise<AxiosResponse> 
    return this.httpService.post(url, data).toPromise();
                                           ^^^^^^^^^^^^^

注意return await 几乎(除了try catch)总是多余的。

【讨论】:

不再有效,toPromise 已弃用【参考方案2】:

由于toPromise() 已被弃用,您可以将其替换为firstValueFromlastValueFrom

例如:

const resp = await firstValueFrom(this.http.post(`http://localhost:3000/myApi`)

https://rxjs.dev/deprecations/to-promise

【讨论】:

救命..谢谢【参考方案3】:

rxjs 库是最强大的并发包,它选择表单处理系统事件(如点击)、外部请求(如获取数据或删除记录)以及 ....

这个库背后的主要概念是:

处理未来接收的数据

因此,您最常在可观察对象中使用 3 个参数,例如

observablSource.subscribe(
   data =>  ... ,
   failure =>  ... ,
   compelete =>  ... 
)

但对于大多数后端开发人员来说,使用来自 ECMAScript 6 feature 并且是 javascript 的原生部分的 Promises

默认情况下,Angular 4+ 和 Nest.js 使用支持 Observablerxjs。在技​​术细节中,您可以找到将可观察到的自动更改为承诺的解决方案。

const data: Observable<any>;
data.from([
   
      id: 1,
      name: 'mahdi'
   , 
   
      id: 2,
      name: 'reza'
   ,
 ])

现在您已经模拟了来自服务器的可观察类型的请求。如果您想将其转换为 Pormise,请使用链式方法,例如:

   data.toPromise();

从这一步开始,您已承诺使用它更好地附加对象和表单 async/await

 async userList( URL: string | URLPattern ) 
    const userList = await this.http.get<any>( URL ).toPromise();
    ...
 

【讨论】:

感谢您的帮助马赫迪!我就是这么做的!【参考方案4】:

以下是工作代码的完整示例:

.toPromise() 实际上不见了

async getAuthToken() 
    const payload = 
      "SCOPE": this.configService.get<string>('SCOPE'),
      "EMAIL_ID": this.configService.get<string>('EMAIL_ID'),
      "PASSWORD": this.configService.get<string>('PASSWORD'),
    ;
    const url = this.configService.get<string>('AUTHTOKEN_URL')
    const response = await this.httpService.post(
      url,
      payload
    ).toPromise();
    console.log(response.data);
    return response.data;
  

【讨论】:

【参考方案5】:

你可以在每个方法调用的末尾添加 .toPromise() ,但是你失去了 observables 的能力,就像它能够通过添加重试运算符来为失败的 http 调用添加重试。

您可以自己实现这些功能并创建自己的模块,或者只使用已经实现它的包,如下所示:https://www.npmjs.com/package/nestjs-http-promise

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review 更改了答案以包括这里的主要部分:)【参考方案6】:

试试下面的这些,而不是仅仅 async-await。

弃用 toPromise 背后有一些基本原因。

我们知道 Promise 和 Observables 这两个集合都可能随着时间的推移产生值。 其中 Observables 不返回或返回更多,而 Promise 在解析成功时只返回一个值。

看到背后有一个主要原因

官方:https://rxjs.dev/deprecations/to-promise 堆栈:Rxjs toPromise() deprecated

现在我们有了 2 个新功能。

lastValueFrom : 当 Observable 完成更多时到达的最后一个值 https://rxjs.dev/api/index/function/firstValueFrom

firstValueFrom:您可能希望在第一个值到达时获取它,而无需等待 Observable 完成以获取更多 https://rxjs.dev/api/index/function/lastValueFrom

【讨论】:

以上是关于NestJs 异步 httpService 调用的主要内容,如果未能解决你的问题,请参考以下文章

RxJS:使用 NestJS HttpService 对分页 API 进行并行 http 调用

如何使用 jest 测试 HttpService.Post 调用

在 Nest JS 中发出 http 请求时出现 httpService 未定义错误

NestJS 将 Authorization 标头传递给 HttpService

在 NestJS 中缓存 axios httpService

NestJS 返回 HTTP 请求的结果