如何使用@nestjs/axios 发出 api Get 请求

Posted

技术标签:

【中文标题】如何使用@nestjs/axios 发出 api Get 请求【英文标题】:How to make an api Get request using @nestjs/axios 【发布时间】:2022-01-23 18:39:32 【问题描述】:

我想从 OpenWeatherMap 获取一个城市的天气信息,但我得到一个奇怪的 JSON 响应

回复我收到的

“名称”:“达拉斯”, “天气”: “资源”: “资源”: , "_id": "61c335daeb8c6b030489996b", “__v”:0

cities.service.ts

@Injectable()
export class CitiesService 
  constructor(
    @InjectModel('City') private readonly cityModel: Model<City>,
    private readonly httpService: HttpService
  ) 

  async createCity(createCityDto: CreateCityDto) 
    const  name  = createCityDto;

    // Get city weather from OpenWeatherMap
    const weather = await this.httpService
      .get(
        `api.openweathermap.org/data/2.5/weather?q=$name&appid=$process.env.OPEN_WEATHER_API_KEY`,
      )
      .pipe(
        map((response) => response.data),
        map((data) => data),
      );

    console.log(weather);

    const city = new this.cityModel(
      name,
      weather,
    );

    await city.save();

    return city;
  

【问题讨论】:

【参考方案1】:

@nestjs/axios 将所有 HTTP 调用包装在 RxJS Observables 中,这有点像增压回调。一旦你打开了一个 observable 流,你要么只需要在这个流中工作(使用 .pipe 和你开始映射数据时的操作符),要么你需要将 Observable 转换为一个 Promise。最简单的方法是使用lastValueFrom 并用它包裹整个 Observbale (lastValueFrom(this.http.get().pipe()))。如果你选择前者,tapswitchMap 可能也是两个运营商要掌握的窍门,否则 lastValueFrom 方法可以将 awaited 作为正常的承诺。

【讨论】:

非常感谢!

以上是关于如何使用@nestjs/axios 发出 api Get 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何使用严格类型的有效负载发出事件? | Vue 3 组合 API + TypeScript

如何在 Kotlin 中发出 API 请求?

使用过期令牌发出同时 API 请求时如何避免多个令牌刷新请求

服务器如何检测使用 fetch API 发出的请求?

如何使用 Angular2 向外部 API 发出 POST 请求?

如何使用 Phonegap 插件(适用于 Android)向 API 发出简单的 json 发布请求?