Как использовать Nest JS для получения данных от стороннего API - PullRequest
0 голосов
/ 27 апреля 2020

Я недавно начал изучать Nest JS, так как он кажется прекрасной структурой, помогающей создать бэкэнд моих проектов. То, что мне нужно изучить, и у меня возникают проблемы с поиском, - это способ получения данных от стороннего API. Согласно документам, он включает в себя Ax ios, и это здорово, так как я хорошо знаю Ax ios. Что я не могу понять, так это как заставить его работать.

Я пытаюсь в целях обучения получить данные о погоде из OpenWeatherMap.org. Когда я строил леса приложения, я использовал nest new weather-app и сгенерировал по порядку погодный модуль, сервис и контроллер, чтобы убедиться, что все правильно интегрировано с nest g <<<type of file>>> weather. Вы можете смело предположить, что мой app.module.ts правильно импортировал мой weather.module.ts. Кроме того, мой ключ API OpenWeatherMap копируется прямо в мой .env.

Вот мой weather.module.ts:

require('dotenv').config();
import { Module, HttpModule } from '@nestjs/common';
import { WeatherService } from './weather.service';
import { WeatherController } from './weather.controller';

@Module({
  imports: [
    HttpModule.register({
      baseURL: 'api.openweathermap.org/data/2.5/weather',
      params: {
        appid: process.env.OPEN_WEATHER_KEY,
      },
    }),
  ],
  providers: [WeatherService],
  controllers: [WeatherController],
})
export class WeatherModule {}

Это мой weather.service.ts:

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

@Injectable()
export class WeatherService {
  constructor(private readonly httpService: HttpService) {}

  forCity(city: string): Observable<AxiosResponse<object>> {
    return this.httpService.get(`?q=${city}`);
  }
}

А это мой weather.controller.ts:

import { Controller, Get, Param } from '@nestjs/common';
import { WeatherService } from './weather.service';

@Controller('weather')
export class WeatherController {
  constructor(private readonly weatherService: WeatherService) {}

  @Get(':city')
  getWeather(@Param('city') city: string): object {
    return this.weatherService.forCity(city);
  }
}

Когда я запускаю этот проект, Nest успешно строит все без ошибок. Однако когда я go Почтальону и пытаюсь достичь своей конечной точки, я получаю это:

nest-weather app postman error

Я думаю, что я следовал за Гнездом JS Документы довольно близко, как и мой собственный опыт работы с Ax ios, но я не могу понять, что я делаю здесь неправильно. У меня есть более крупный проект, в котором я хотел бы использовать Nest, но мне нужно было бы использовать сторонний API, чтобы этот проект работал.

Есть идеи?

Заранее спасибо!

Обновление: после использования метода Observable pipe и catchError я получил статус 401. Сначала я подумал, что это означает, что мой ключ API не был правильно передан, но я вышел из системы, и он соответствует тому, что есть в моем аккаунте для API погоды.

2-е обновление: пару дней позже (включая выходной), и у меня все еще нет никакого успеха. Если я перенесу свой URL и ключ API в weather.services.ts, я получу циклическую ссылку. Я прочитал документы для Гнезда и Топора ios до конца и похоже, и я все еще не могу заставить это работать.

Я также пытался получить доступ к axiosRef(), который Нест выставляет через HttpService, но в итоге получил ошибку компиляции Typescript для преобразования моего Observable типа в Promise. Все, что я сделал, это дало мне еще один циркуляр.

...