Typescript NestJS HttpService调用多个端点
我通常是一名PHP开发人员,几乎没有使用javascript/typescript的经验。刚开始使用NestJS-我想要一个端点,它返回通过端点从另一个系统检索的Typescript NestJS HttpService调用多个端点,typescript,axios,nestjs,Typescript,Axios,Nestjs,我通常是一名PHP开发人员,几乎没有使用javascript/typescript的经验。刚开始使用NestJS-我想要一个端点,它返回通过端点从另一个系统检索的请购单列表 大概的想法是: 使用凭据调用登录端点 使用登录端点的令牌调用请求列表端点 返回结果 我已经尝试过这样调用端点: consturl='1〕https://the-requisition-endpoint'; 常量配置:AxiosRequestConfig={ 标题:{ “接受”:“应用程序/json”, “授权”:“硬编码的令
请购单列表
大概的想法是:
使用凭据调用登录端点
使用登录端点的令牌调用请求
列表端点
返回结果
我已经尝试过这样调用端点:
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)并查看下一个
函数中返回的值。您可以在我的服务器中看到一些。也可以查看测试以查看订阅