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

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

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

【问题讨论】:

    标签: javascript node.js typescript nestjs


    【解决方案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 在解析成功时只返回一个值。

      看到背后有一个主要原因

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-16
        • 2021-12-10
        • 2019-08-21
        • 2021-12-14
        • 2019-08-31
        • 2020-06-23
        • 2021-12-21
        • 2021-02-06
        相关资源
        最近更新 更多