Creo este archivo .env :
TYPE=xxx HOST=xxx, PORT=xxx, USERNAME=xxx, PASSWORD=xxx, DATABASE=xxx,en mi archivo uso de esta manera:
import * as dotenv from "dotenv"; dotenv.config(); export const typeOrmConfig: TypeOrmModuleOptions = { port: process.env.PORT } pero solo puedo usar mi variable de port del archivo .env y no puedo usar el resto de las variables, ¿alguien puede decirme por qué no puedo usar el resto de mis vars?
También tuve este problema, me estaba volviendo loco hasta que me di cuenta de que copié los valores de entorno pegados de un archivo YAML que no tiene el mismo formato que el archivo .env .
Uno usa : , el otro usa = .
Si ayuda a otra alma de desarrollador :-)
Debe importar el dotenv y ejecutar dotenv.config() en la parte superior del archivo raíz.
Tan pronto como sea posible en su aplicación, solicite y configure dotenv. Ref: dotenv-npm
Esta es la forma en que Nestjs establece variables de entorno:
npm install @nestjs/config Ese paquete usa internamente el paquete dotenv que reúne todas las variables de entorno en su máquina.
aplicación.módulo.ts
// configModule chooses the .env file, configservice extract the settings import { ConfigModule, ConfigService } from '@nestjs/config'; @Module({ imports: [ // list your project's modules ConfigModule.forRoot({ // this is set so we do not have to reimport the ConfigModule all over the place into other modules isGlobal: true, envFilePath: `.env.${process.env.NODE_ENV}`, }), // Notice we are not using TypeOrmModule.forRoot({}) // we set this to get access to ConfigService through dependency injection system TypeOrmModule.forRootAsync({ // this tell DI system, find the configService which has all of the config info inject: [ConfigService], useFactory: (config: ConfigService) => { return { type: 'sqlite', database: config.get<string>('DATABASE'), synchronize: true, entities: [User, Report], }; }, }),Si obtiene un valor indefinido y usa ES6, debe importarlo de la siguiente manera (el archivo .env debe estar en el directorio raíz del proyecto):
¿Cómo uso dotenv con import?
- Precarga dotenv: nodo --requiere dotenv/config index.js (Nota: no necesitas importar dotenv con este enfoque)
- Importe dotenv/config en lugar de dotenv (Nota: no necesita llamar a dotenv.config() y debe pasar opciones a través de la línea de comandos o variables de entorno con este enfoque)
- Cree un archivo separado que ejecutará la configuración primero como se describe en este comentario en el n.° 133
Tienes que importar en el archivo app.ts de tu proyecto (primero) Ejemplo con express:
aplicación.ts
//here import 'dotenv/config' import express from 'express' import { userRouter } from './routes/user' const app = express() app.use(`/users`, userRouter) app.listen(process.env.PORT, () => { console.log(`running`) })Ahora úsalo en cualquier parte de tu proyecto
Siempre es bueno leer la documentación .
Mi proyecto tiene una configuración de eslint , por lo que tengo que deshabilitar la import/first
/* eslint-disable import/first */ require('dotenv').config(); import Koa from 'koa'; import { Logger } from './utils/loggers'; import { app } from './app'; const LOGGER = Logger(); const port = parseInt(process.env.PORT as string, 10) || 8081; const server = (server: Koa) => { server.listen(port, () => { LOGGER.info(`> Ready on http://localhost:${port}`); }); }; server(app());También podemos usar:
import 'dotenv/config'pero
require('dotenv').config({path:path_to_dotenv});es más flexible.
Si se trata de una aplicación React y está utilizando el script de reacción, debe anteponer la clave con REACT_APP_; de lo contrario, se ignorarán.
REACT_APP_TYPE=xxx REACT_APP_HOST=xxx REACT_APP_PORT=xxx REACT_APP_USERNAME=xxx REACT_APP_PASSWORD=xxx REACT_APP_DATABASE=xxxRef -> https://create-react-app.dev/docs/adding-custom-environment-variables/
Podría usar la forma integrada de NestJs para manejar esto (ConfigModule).
// main.ts import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { InventoriesModule } from './inventories/inventories.module'; import typeORMConfig from './config/database.config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { PrismaModule } from './prisma/prisma.module'; @Module({ imports: [ ConfigModule.forRoot(), // load .env file TypeOrmModule.forRoot(typeORMConfig()), InventoriesModule, PrismaModule ], }) export class AppModule { } // ./config/database.config import { TypeOrmModuleOptions } from '@nestjs/typeorm'; export default function (): TypeOrmModuleOptions { return { 'type': 'mysql', 'host': process.env.DB_HOST, 'port': 3306, 'username': process.env.DB_USERNAME, 'password': process.env.DB_PASSWORD, 'database': process.env.DB_DATABASE, 'entities': ['dist/**/*.entity{.ts,.js}'], 'synchronize': false } };En realidad, ha definido la ruta del archivo .env
Prueba así
import * as dotenv from "dotenv"; dotenv.config({ path: __dirname+'/.env' });Prueba esto también
require('dotenv').config({ path: __dirname+'/.env' });Cambie la ruta del archivo .env según sea necesario
referencia: https://www.npmjs.com/package/dotenv