代码之家  ›  专栏  ›  技术社区  ›  Tauseef Razaq

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

  •  1
  • Tauseef Razaq  · 技术社区  · 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 文件正在生产构建中加载,我该如何修复此问题?

    1 回复  |  直到 1 年前
        1
  •  1
  •   Yuvaraj M    1 年前

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

    您可以有一个脚本来复制 .env 到dist文件夹

    "build": "cp .env ./dist/.env && tsc build"
    
    推荐文章