NestJS HttpService调用多个端点

时间:2019-12-26 11:05:59

标签: typescript axios nestjs

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

大概的想法:

  1. 使用凭据呼叫登录端点
  2. 使用登录端点中的令牌呼叫requisition列表端点
  3. 返回结果

我已经尝试过像这样调用端点:

const url ='https://the-requisition-endpoint';
const config: AxiosRequestConfig = {
      headers: {
        'Accept': 'application/json',
        'Authorization': 'a_hard_coded_token_string' // hard coded for experimentation
      }
    };
let result = this.httpService.get(url, config);
result.subscribe(response =>
  console.log(response.data);
});

现在,我需要对其进行更改,以便不对令牌进行硬编码-要使用来自登录端点的令牌。

我不确定如何仅在登录端点返回令牌后才强制调用请求端点。我搜索后发现,是Promise.all()a function called zip might help, 但是我不知道如何使它起作用。

1 个答案:

答案 0 :(得分:1)

我相信您要查找的RxJS运算符是switchMap。本质上,您将需要做这样的事情:

@Injcetable()
export class MyService {

  constructor(private readonly httpService: HttpService) {}

  getRequisitions(): Observable<any> {
    // change to POST signature is login is a post. post(url, body, config)
    return this.httpService.get(url, config).pipe(
      // optional, but it makes working with responses easier
      map(resp => resp.data),
      // make new http call and switch to this observable
      switchMap(loginData => this.httpService.get(url, configWithLoginData)),
      / again, optional, but useful for keeping data easily readable
      map(resp => resp.data),
      // optional, but useful for checking what is returned
      tap(data => console.log(data))
  }
}

好的,这里发生了很多事情,所以我们也将其分解。在NestJS中,内置的HttpService返回Observables而不是Promises。这使您可以执行一些非常强大的工作,例如在发生某些故障时重试HTTP调用。可以用promises来完成,但是确实需要更多代码。无论如何,在第一个HTTP调用之后的.pipe允许我们开始处理RxJS流并处理通过的数据。

map是一个RxJS运算符,与Array.prototype.map运算符类似,因为它对每个可观察到的值应用了转换函数(在这种情况下,它只是一个值,但它可以工作对于许多理论上的人。)

switchMapmergeMapconcatMap一起是RxJS中的扁平化运算符之一。我将让您从与上述相同的链接中进行阅读,但实际上,switchMap取消了当前可观察到的内容,而推荐使用新创建的链接,这有助于我们避免内存泄漏。我们返回一个新的Observable(一个新的HttpService调用),并开始使用该数据。

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

最后,没有subscribe,因为NestJS将在后台进行订阅并发送最后发出的值作为响应。不必自己担心。

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

每个RxJS运算符都接受一个函数,在每种情况下,我们都是使用一个行函数。如果需要,您可以使用完整的匿名函数语法。即

map((resp) => {
  return resp.data;
})

单行语法只是较短的语法,尽管如果必须执行不适合一行的其他逻辑,则将需要重写。