首页 > 解决方案 > 如何处理 axios httpservice 可观察响应?

问题描述

我想我快疯了,因为我对节点和打字稿还很陌生……我只是想以同步的方式检索 http get 请求的结果。

鉴于:

import { Injectable, HttpService } from '@nestjs/common';
import {} from '@nestjs/core';

@Injectable()
export class AppService {
  private readonly DATA_URL:string = "https://remote/data.json";
  constructor(private httpService:HttpService){}
  getSomething(): Array<Object> {
   let resp = this.httpService.get(this.DATA_URL); //what do I do now?? It's an observable
  }
}

编辑:我在这里写完整的代码,因为它可能对学习框架的其他人有用。我使用了杰的回应,但richbai 在理解背后的理论方面也帮助了我很多。如果它仍然可以变得更好,当然会改进/纠正。

  1. 我添加了一个类型来更好地控制而不是 Object
  2. 我需要将响应中的日期字段从“yyyy-mm-ddThh24:mi:ss”更改为“yyyy-mm-dd”
  3. 我还需要根据值过滤响应

     getSomething(aFilterValue:number): Observable<RespDTO[]> {
        return this.httpService.get(this.DATA_URL).pipe(
        map((axiosResponse : AxiosResponse) => (axiosResponse.data as 
       RespDTO[])
    .filter((el:RespDTO) => el.aCode===aFilterValue)
    .map((el:RespDTO) => ({...el,aDateField:el.aDateField.split('T')[0]}))),
    );
    }
    

标签: typescriptaxiosnestjs

解决方案


如果您需要从 Nest 服务执行此操作,并将结果返回给客户端,您可以简单地返回 observable,Nest 将从那里为您处理订阅。如果您需要进行任何额外的数据处理,您可以在.map运算符之后使用运算.pipe()Observable。这方面的一个例子可能是从 axios 响应中获取数据,而不是整个响应(这会有问题,JSON.stringify()因为它本身有循环引用)。

下面是一个这样的例子

import { Injectable, HttpService } from '@nesjts/common';
import { AxiosResponse } from 'axios';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable()
export class HttpConsumingService {
  private readonly DATA_URL = 'http://remote/data.json';
  constructor(private readonly http: HttpService) {}

  callHttp(): Observable<Array<Object>> {
    return this.http.get(this.DATA_URL).pipe(
      map((axiosResponse: AxiosResponse) => {
        return axiosResponse.data;
      })
    );
  }
}

从这里开始,如果您有一个调用 的控制器this.httpConsumingService.callHttp(),Nest 将调用该服务,订阅 observable,并在后台返回数据。不需要额外的工作。如果您正在寻找有关 Observables 和可用操作的更多信息,learnrxjs.io是一个很好的来源。


推荐阅读