为什么生产版本不读取 Node.js (TypeScript) 中的 .env 变量?

问题描述 投票:0回答:1

我在使用 TypeScript 编写的 Node.js 后端项目时遇到问题。在本地,一切正常,并且使用

.env
包正确加载了
dotenv
文件中定义的环境变量。但是,在构建生产项目后,当我运行构建的 JavaScript 文件时,环境变量似乎没有加载。

这就是我正在做的:

项目结构:

我正在使用 dotenv 在我的 index.ts 文件中加载环境变量。 我的 index.ts 文件初始化 Express 服务器并使用 Sequelize 连接到 PostgreSQL 数据库。 使用 npm run build 构建项目后,我使用 node dist/index.js 运行生产构建。 环境变量:

我正在项目根目录的 .env 文件中定义变量。这是 .env 文件的示例:

PORT=3000
POSTGRES_URL=postgres://default:****@*****:5432/verceldb?sslmode=require

数据库配置:

我的database.ts文件从环境变量中读取PostgreSQL连接字符串,如下所示:

import { Sequelize } from 'sequelize';

const databaseUrl = process.env.POSTGRES_URL;

if (!databaseUrl) {
    throw new Error('Database URL is not defined');
}

console.log('Database URL:', databaseUrl);


const sequelize = new Sequelize(databaseUrl, {
    dialect: 'postgres',
    dialectOptions: {
        ssl: {
            require: true,
            rejectUnauthorized: false,
        },
    },
});

export default sequelize;

生产构建:

我使用 TypeScript 编译器和

npm run build
构建项目。 tsc 命令在 dist/ 目录中生成 JavaScript 文件。

当我尝试使用 Node dist/index.js 运行生产构建时,出现以下错误:


throw new Error('Database URL is not defined');
    ^

Error: Database URL is not defined
    at Object.<anonymous> (/home/tauseef/fastiya/backend/dist/config/database.js:7:11)
    at Module._compile (node:internal/modules/cjs/loader:1369:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1427:10)
    at Module.load (node:internal/modules/cjs/loader:1206:32)
    at Module._load (node:internal/modules/cjs/loader:1022:12)
    at Module.require (node:internal/modules/cjs/loader:1231:19)
    at require (node:internal/modules/helpers:179:18)
    at Object.<anonymous> (/home/tauseef/fastiya/backend/dist/index.js:11:36)
    at Module._compile (node:internal/modules/cjs/loader:1369:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1427:10)

Node.js v20.12.2

我尝试过的:

  1. 验证
     dotenv.config()
    在我的
    index.ts
    文件顶部被调用。
  2. 确保
    .env
    文件存在于根目录中。
  3. 检查部署环境,确保
    .env
    文件配置正确且可访问。

为什么我的

.env
文件中的环境变量没有加载到生产版本中,我该如何解决这个问题?

node.js typescript build production dotenv
1个回答
0
投票

问题是当您运行构建时,它不会在 dist 文件夹中生成

.env

您可以使用脚本将

.env
复制到 dist 文件夹

"build": "cp .env ./dist/.env && tsc build"
© www.soinside.com 2019 - 2024. All rights reserved.