Módulo HTTP axios

Intermedio
Nest
Nest
Actualizado: 15/06/2025

Módulo HTTP axios en Nest

El módulo HTTP de NestJS proporciona una integración nativa con axios para realizar peticiones HTTP a servicios externos. Este módulo encapsula la funcionalidad de axios dentro del ecosistema de NestJS, permitiendo aprovechar las ventajas de la inyección de dependencias y la gestión de configuración del framework.

Instalación y configuración básica

Para utilizar el módulo HTTP, primero debemos instalarlo junto con axios:

npm install @nestjs/axios axios

Una vez instalado, necesitamos importar el HttpModule en nuestro módulo. La configuración más básica se realiza de la siguiente manera:

import { Module } from '@nestjs/common';
import { HttpModule } from '@nestjs/axios';
import { ApiService } from './api.service';

@Module({
  imports: [HttpModule],
  providers: [ApiService],
  exports: [ApiService],
})
export class ApiModule {}

Inyección del HttpService

El HttpService es el servicio principal que nos permite realizar peticiones HTTP. Se inyecta como cualquier otro servicio en NestJS:

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

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

  getData(): Observable<AxiosResponse<any>> {
    return this.httpService.get('https://jsonplaceholder.typicode.com/posts');
  }
}

Es importante notar que el HttpService devuelve observables de RxJS, no promesas directamente. Esto permite un manejo más avanzado de las respuestas asíncronas.

Configuración avanzada del módulo

El HttpModule permite configuraciones más específicas mediante el método register():

import { Module } from '@nestjs/common';
import { HttpModule } from '@nestjs/axios';

@Module({
  imports: [
    HttpModule.register({
      timeout: 5000,
      maxRedirects: 5,
      baseURL: 'https://api.ejemplo.com',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': 'Bearer token-ejemplo',
      },
    }),
  ],
  providers: [ApiService],
})
export class ApiModule {}

Esta configuración establece un timeout global, una URL base y headers por defecto que se aplicarán a todas las peticiones realizadas desde este módulo.

Manejo de respuestas con operadores RxJS

Dado que el HttpService devuelve observables, podemos utilizar operadores de RxJS para transformar y manejar las respuestas:

import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { map, catchError } from 'rxjs/operators';
import { Observable, throwError } from 'rxjs';

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

  getUsers(): Observable<any[]> {
    return this.httpService
      .get('https://jsonplaceholder.typicode.com/users')
      .pipe(
        map(response => response.data),
        catchError(error => {
          console.error('Error al obtener usuarios:', error);
          return throwError(() => new Error('Error en la petición'));
        }),
      );
  }
}

El operador map() nos permite extraer únicamente los datos de la respuesta, mientras que catchError() maneja los errores de forma elegante.

Conversión a promesas

Si preferimos trabajar con promesas en lugar de observables, podemos convertir fácilmente las respuestas:

import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';

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

  async getUserById(id: number): Promise<any> {
    try {
      const response = await firstValueFrom(
        this.httpService.get(`https://jsonplaceholder.typicode.com/users/${id}`)
      );
      return response.data;
    } catch (error) {
      throw new Error(`Error al obtener usuario ${id}: ${error.message}`);
    }
  }
}

La función firstValueFrom() convierte el observable en una promesa que se resuelve con el primer valor emitido.

Peticiones POST con datos

Para realizar peticiones POST con datos, el proceso es similar pero incluyendo el cuerpo de la petición:

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

  async createUser(userData: any): Promise<any> {
    try {
      const response = await firstValueFrom(
        this.httpService.post(
          'https://jsonplaceholder.typicode.com/users',
          userData,
          {
            headers: {
              'Content-Type': 'application/json',
            },
          }
        )
      );
      return response.data;
    } catch (error) {
      throw new Error(`Error al crear usuario: ${error.message}`);
    }
  }
}

Configuración dinámica con ConfigService

Para aplicaciones más robustas, es recomendable utilizar el ConfigService para manejar la configuración de forma dinámica:

import { Module } from '@nestjs/common';
import { HttpModule } from '@nestjs/axios';
import { ConfigModule, ConfigService } from '@nestjs/config';

@Module({
  imports: [
    HttpModule.registerAsync({
      imports: [ConfigModule],
      useFactory: async (configService: ConfigService) => ({
        timeout: configService.get('HTTP_TIMEOUT', 5000),
        baseURL: configService.get('API_BASE_URL'),
        headers: {
          'Authorization': `Bearer ${configService.get('API_TOKEN')}`,
        },
      }),
      inject: [ConfigService],
    }),
  ],
  providers: [ApiService],
})
export class ApiModule {}

Esta configuración permite cargar valores desde variables de entorno o archivos de configuración, haciendo la aplicación más flexible y segura.

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en Nest

Documentación oficial de Nest
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Nest es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Nest

Explora más contenido relacionado con Nest y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Comprender la integración del módulo HTTP de NestJS con axios.
  • Aprender a instalar y configurar el HttpModule en un proyecto NestJS.
  • Entender cómo inyectar y utilizar HttpService para realizar peticiones HTTP.
  • Manejar respuestas usando operadores de RxJS y convertir observables en promesas.
  • Configurar dinámicamente el módulo HTTP usando ConfigService para mayor flexibilidad.