Typescript NestJS HttpService调用多个端点

Typescript NestJS HttpService调用多个端点,typescript,axios,nestjs,Typescript,Axios,Nestjs,我通常是一名PHP开发人员,几乎没有使用javascript/typescript的经验。刚开始使用NestJS-我想要一个端点,它返回通过端点从另一个系统检索的请购单列表 大概的想法是: 使用凭据调用登录端点 使用登录端点的令牌调用请求列表端点 返回结果 我已经尝试过这样调用端点: consturl='1〕https://the-requisition-endpoint'; 常量配置:AxiosRequestConfig={ 标题:{ “接受”:“应用程序/json”, “授权”:“硬编码的令

我通常是一名PHP开发人员,几乎没有使用javascript/typescript的经验。刚开始使用NestJS-我想要一个端点,它返回通过端点从另一个系统检索的
请购单列表

大概的想法是:

  • 使用凭据调用登录端点
  • 使用登录端点的令牌调用
    请求
    列表端点
  • 返回结果
  • 我已经尝试过这样调用端点:

    consturl='1〕https://the-requisition-endpoint';
    常量配置:AxiosRequestConfig={
    标题:{
    “接受”:“应用程序/json”,
    “授权”:“硬编码的令牌字符串”//硬编码用于实验
    }
    };
    让result=this.httpService.get(url,config);
    结果。订阅(响应=>
    console.log(response.data);
    });
    
    现在我需要更改它,以便令牌不被硬编码-使用来自登录端点的令牌

    我不知道如何强制请求端点仅在登录端点返回令牌后调用。我搜索并发现要么是一个
    Promise.all()
    或者,
    但是我不知道如何让它工作。

    我相信您正在寻找的RxJS运营商是最合适的。基本上,您将希望最终执行以下操作:

    @injetable()
    导出类MyService{
    构造函数(私有只读httpService:httpService){}
    getRequisitions():可观察{
    //对POST签名的更改是登录是POST.POST(url、正文、配置)
    返回此.httpService.get(url,config).pipe(
    //可选,但它使处理响应更容易
    映射(响应=>响应数据),
    //进行新的http调用并切换到此可观察状态
    switchMap(loginData=>this.httpService.get(url,configWithLoginData)),
    /同样,这是可选的,但对于保持数据易于读取非常有用
    映射(响应=>响应数据),
    //可选,但用于检查返回的内容
    点击(数据=>console.log(数据))
    }
    }
    
    好的,这里发生了很多事情,让我们把它分解一下。在NestJS中,内置的HttpService返回可观察的而不是承诺。这允许你做一些非常强大的事情,比如在出现某些故障时重试HTTP调用。这可以通过承诺来完成,但需要更多的代码。无论如何,
    .pipe
    在第一次HTTP调用之后,我们可以开始操作RxJS流,并在数据通过时处理数据

    map
    是一个RxJS操作符,类似于
    Array.prototype.map
    操作符,它对可观察对象发出的每个值应用一个转换函数(在这种情况下,它只是一个值,但在理论上可能适用于许多值)

    switchMap
    mergeMap
    concatMap
    一起,是RxJS中的展平操作符之一。我将让您从上面相同的链接阅读这些操作符,但本质上,
    switchMap
    取消当前的可观测值,而代之以新创建的可观测值,这有助于我们避免内存泄漏。我们返回一个新的Observable(一个新的HttpService调用),并开始处理该数据

    tap
    是一个间谍操作员,因为它对它所访问的数据不做任何操作,它只允许您查看数据(通过console.log)。这几乎就是它的用途,但是如果需要并且响应无关紧要,您可以进行其他调用

    最后,没有
    subscribe
    ,因为NestJS将在引擎盖下订阅,并发送最后发出的值作为响应。我们自己不必担心

    哦,所有
    映射(resp=>resp.data)
    的响应都是AxiosResponse有几个字段,但在大多数情况下,您可能只关心
    data
    属性中保存的返回数据

    每个RxJS操作符都接受一个函数,我们在这里使用一行函数。如果你愿意,你可以使用完整的匿名函数语法

    map((resp)=>{
    返回相应的数据;
    })
    

    单行语法只是比较短,但如果必须执行不适合一行的附加逻辑,则需要重新编写。

    您好,感谢您的响应和链接,这非常有用。不过有一个问题,我如何“执行”整个过程?我有这样一个问题:
    让requisiondata=this.login().pipe(…
    ,然后当我执行
    控制台.log(requisiondata);
    时,它说它是一个可观察的。如果这是一个HTTP响应,即控制器调用的某个服务,你可以返回可观察的,让NestJS在引擎盖下订阅。如果这是手动执行,你可以添加
    .subscribe({next:(val)=>void,error:)=>void,complete:()=>void})
    (这些是签名,您可以根据需要对它们进行处理,只需确保它们返回void)并查看
    下一个
    函数中返回的值。您可以在我的服务器中看到一些。也可以查看测试以查看订阅