Qué es un provider asíncrono
Los providers asíncronos en NestJS son servicios que requieren operaciones asíncronas durante su inicialización antes de estar disponibles para la inyección de dependencias. A diferencia de los providers síncronos tradicionales, estos necesitan completar tareas como conexiones a bases de datos, llamadas a APIs externas o lectura de archivos de configuración antes de que la aplicación pueda utilizarlos.
Casos de uso comunes
Los providers asíncronos resultan especialmente útiles en escenarios donde necesitas:
- Establecer conexiones a bases de datos que requieren autenticación
- Cargar configuraciones desde servicios externos o archivos remotos
- Inicializar clientes de APIs de terceros con credenciales dinámicas
- Configurar servicios que dependen de recursos externos
Implementación básica
Para crear un provider asíncrono, utilizas la función useFactory
junto con la propiedad inject
para especificar las dependencias necesarias:
import { Module } from '@nestjs/common';
@Module({
providers: [
{
provide: 'DATABASE_CONNECTION',
useFactory: async () => {
// Simulación de conexión asíncrona
const connection = await createDatabaseConnection({
host: 'localhost',
port: 5432,
database: 'myapp'
});
return connection;
},
},
],
exports: ['DATABASE_CONNECTION'],
})
export class DatabaseModule {}
Inyección de dependencias en providers asíncronos
Cuando tu provider asíncrono necesita otras dependencias, puedes inyectarlas usando la propiedad inject
:
@Module({
providers: [
ConfigService,
{
provide: 'API_CLIENT',
useFactory: async (configService: ConfigService) => {
const apiKey = await configService.getApiKey();
const baseUrl = configService.get('API_BASE_URL');
return new ApiClient({
apiKey,
baseUrl,
timeout: 5000
});
},
inject: [ConfigService],
},
],
})
export class ApiModule {}
Manejo de errores en la inicialización
Es fundamental implementar un manejo adecuado de errores en los providers asíncronos, ya que los fallos durante la inicialización pueden impedir que la aplicación arranque correctamente:
{
provide: 'REDIS_CLIENT',
useFactory: async (configService: ConfigService) => {
try {
const redisConfig = {
host: configService.get('REDIS_HOST'),
port: configService.get('REDIS_PORT'),
password: configService.get('REDIS_PASSWORD')
};
const client = new Redis(redisConfig);
await client.ping(); // Verificar conexión
return client;
} catch (error) {
console.error('Error conectando a Redis:', error);
throw new Error('No se pudo establecer conexión con Redis');
}
},
inject: [ConfigService],
}
Uso en servicios
Una vez configurado el provider asíncrono, puedes inyectarlo en tus servicios utilizando el decorador @Inject()
con el token correspondiente:
import { Injectable, Inject } from '@nestjs/common';
@Injectable()
export class UserService {
constructor(
@Inject('DATABASE_CONNECTION')
private readonly dbConnection: any,
@Inject('API_CLIENT')
private readonly apiClient: any
) {}
async findUser(id: string) {
// Usar la conexión inicializada
return await this.dbConnection.query('SELECT * FROM users WHERE id = ?', [id]);
}
async syncUserData(userId: string) {
// Usar el cliente API inicializado
return await this.apiClient.get(`/users/${userId}`);
}
}
La inicialización asíncrona garantiza que todos los recursos externos estén disponibles y correctamente configurados antes de que tu aplicación comience a procesar peticiones, proporcionando una base sólida para el funcionamiento de tus servicios.
Fuentes y referencias
Documentación oficial y recursos externos para profundizar en Nest
Documentación oficial de Nest
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 qué son los providers asíncronos y su diferencia con los síncronos.
- Identificar casos de uso comunes para providers asíncronos en aplicaciones NestJS.
- Aprender a implementar providers asíncronos usando useFactory e inject.
- Saber cómo manejar errores durante la inicialización asíncrona de providers.
- Conocer la forma de inyectar y utilizar providers asíncronos en servicios NestJS.