为什么使用 NestJS 配置 TypeORM CLI 时不读取特定于环境的文件?

Why environment specific file is not read when configuring TypeORM CLI with NestJS?

提问人:rshehi 提问时间:11/5/2023 更新时间:11/5/2023 访问量:42

问:

我正在尝试使用 NestJS 设置 TypeORM 迁移。我创建了特定于环境的文件;但是,每当我尝试指定确切的文件以从返回中读取变量时。应用程序已 dockerized。.env.developmentprocess.env.NODE_ENVundefined

Dockerfile.development:

FROM node:16

WORKDIR /app

COPY package*.json ./

RUN npm install 

COPY . .

CMD [ "npm", "run", "start:dev" ]

docker-compose.development.yml:

version: "3"
services:
  nest-api:
    container_name: clean-architecture-api
    build:
      context: .
      dockerfile: Dockerfile.development
    ports:
      - 3000:3000
    depends_on:
      - db
    env_file:
      - .env.development
    volumes:
      - .:/app
      - /app/node_modules

  db:
    image: postgres:14.1
    restart: always
    container_name: clean-architecture-db
    ports:
      - 5432:5432
    env_file:
      - .env.development
    volumes: 
      - postgres:/var/lib/postgresql/data

  pgadmin:
    container_name: pgadmin
    image: dpage/pgadmin4:6.4
    restart: always
    ports:
    - 8080:80
    volumes:
    - /data/pgadmin:/root/.pgadmin
    env_file:
    - .env.development
    # environment:
    #   PGADMIN_DEFAULT_EMAIL: [email protected]
    #   PGADMIN_DEFAULT_PASSWORD: root

volumes:
  postgres:
    name: clean-architecture-db

.env.development

POSTGRES_USER=admin
POSTGRES_PASSWORD=admin
POSTGRES_DB=nestjs
POSTGRES_HOST=localhost
POSTGRES_PORT=5432
SERVER_PORT=3000

typeOrm.config.ts- 这里返回 undefinedprocess.env.NODE_ENV

import { DataSource } from 'typeorm';
import { ConfigService } from '@nestjs/config';
import { config } from 'dotenv';

config({ path: `.env.${process.env.NODE_ENV}` });

const configService = new ConfigService();

export default new DataSource({
  type: 'postgres',
  host: configService.get('POSTGRES_HOST'),
  port: configService.get('POSTGRES_PORT'),
  username: configService.get('POSTGRES_USER'),
  password: configService.get('POSTGRES_PASSWORD'),
  database: configService.get('POSTGRES_DB'),
  entities: [],
});

package.json脚本:

    "start:dev": "NODE_ENV=development nest start --watch",
    "start:debug": "NODE_ENV=development nest start --debug --watch",
    "start:prod": "NODE_ENV=production node dist/main",
    "typeorm": "ts-node ./node_modules/typeorm/cli",
    "typeorm:run-migrations": "npm run typeorm migration:run -- -d ./src/config/typeOrm.config.ts",
    "typeorm:generate-migration": "npm run typeorm -- -d .src/config/typeOrm.config.ts migration:generate ./src/migrations/$npm_config_name",
    "typeorm:create-migration": "npm run typeorm -- migration:create ./src/migrations/$npm_config_name"

文件夹结构

为什么会这样?

我尝试仅使用 .env 文件,它工作正常。我还尝试使用cross-env来传递变量,但这也没有用

TypeScript nestjs typeorm dotenv

评论


答:

0赞 Jay McDoniel 11/5/2023 #1

NODE_ENV默认情况下,未设置。你的文件中没有,所以当你阅读它时,它是未定义的。若要确保已设置,请将其添加到服务或向服务添加密钥NODE_ENV.env.developmentprocess.env.NODE_ENVNODE_ENV.env.developmentenvironmentnest-api

评论

0赞 rshehi 11/5/2023
我确实添加了;但是,值仍未定义。向服务添加密钥是什么意思?NODE_ENV.env.developmentenvironmentnest-api
0赞 Jay McDoniel 11/5/2023
docker compose 服务可以使用环境键显式设置环境变量。因此,您可以执行类似(正确格式化为 yml)之类的操作,并以这种方式设置值environment: NODE_ENV: development
0赞 rshehi 11/5/2023
我更新了docker-compose的代码,但仍然值未定义
0赞 rshehi 11/5/2023 #2

我想通了 - 需要像这样在package.json中指定 CLI 命令:

"typeorm:dev": "NODE_ENV=development ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js",
"migration:generate:dev": "npm run typeorm:dev -- -d ./type-orm.config.ts migration:generate ./src/migrations/$npm_config_name"