Я недавно начал изучать 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 Почтальону и пытаюсь достичь своей конечной точки, я получаю это:
Я думаю, что я следовал за Гнездом JS Документы довольно близко, как и мой собственный опыт работы с Ax ios, но я не могу понять, что я делаю здесь неправильно. У меня есть более крупный проект, в котором я хотел бы использовать Nest, но мне нужно было бы использовать сторонний API, чтобы этот проект работал.
Есть идеи?
Заранее спасибо!
Обновление: после использования метода Observable pipe
и catchError
я получил статус 401
. Сначала я подумал, что это означает, что мой ключ API не был правильно передан, но я вышел из системы, и он соответствует тому, что есть в моем аккаунте для API погоды.
2-е обновление: пару дней позже (включая выходной), и у меня все еще нет никакого успеха. Если я перенесу свой URL и ключ API в weather.services.ts
, я получу циклическую ссылку. Я прочитал документы для Гнезда и Топора ios до конца и похоже, и я все еще не могу заставить это работать.
Я также пытался получить доступ к axiosRef()
, который Нест выставляет через HttpService
, но в итоге получил ошибку компиляции Typescript для преобразования моего Observable
типа в Promise
. Все, что я сделал, это дало мне еще один циркуляр.