Conexión a Bases de Datos con Variables de Entorno en Node.js
Clase 8 de 36 • Curso de NestJS: Persistencia de Datos con TypeORM
Resumen
// .env, .stag.env, .prod.env
POSTGRES_DB=my_db
POSTGRES_USER=nico
POSTGRES_PASSWORD=postgres
POSTGRES_PORT=5432
POSTGRES_HOST=localhost
// src/config.ts
import { registerAs } from '@nestjs/config';
export default registerAs('config', () => {
return {
database: {
name: process.env.DATABASE_NAME,
port: process.env.DATABASE_PORT,
},
postgres: { // 👈 add config
dbName: process.env.POSTGRES_DB,
port: parseInt(process.env.POSTGRES_PORT, 10),
password: process.env.POSTGRES_PASSWORD,
user: process.env.POSTGRES_USER,
host: process.env.POSTGRES_HOST,
},
apiKey: process.env.API_KEY,
};
});
// src/database/database.module.ts
import { ConfigType } from '@nestjs/config';
import config from '../config';
@Global()
@Module({
providers: [
...
{
provide: 'PG',
useFactory: (configService: ConfigType<typeof config>) => { // 👈
const { user, host, dbName, password, port } = configService.postgres;
const client = new Client({
user,
host,
database: dbName,
password,
port,
});
client.connect();
return client;
},
inject: [config.KEY],
},
],
exports: ['API_KEY', 'PG'],
})
export class DatabaseModule {}
// src/users/services/users.service.ts
import { Client } from 'pg';
@Injectable()
export class UsersService {
constructor(
...,
@Inject('PG') private clientPg: Client, // 👈 inject PG
) {}
getTasks() {
return new Promise((resolve, reject) => {
this.clientPg.query('SELECT * FROM tasks', (err, res) => {
if (err) {
reject(err);
}
resolve(res.rows);
});
});
}
}
// src/users/controllers/users.controller.ts
@Controller('users')
export class UsersController {
@Get('tasks') // 👈 new endpoint
getTasks() {
return this.usersService.getTasks();
}
}