You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js(TypeScript)生产构建无法读取.env变量的原因及解决

TypeScript Node.js生产构建后环境变量无法加载的问题解决

问题原因分析

  1. dotenv未纳入生产依赖:若将dotenv放在devDependencies中,生产环境执行npm install --production时不会安装该包,导致运行时无法加载.env文件。
  2. 工作目录不匹配:运行node dist/index.js时,若当前工作目录不是项目根目录,dotenv会默认在当前目录查找.env,而非项目根目录的.env文件。
  3. 加载顺序错误:ES模块的import会被提升,若在index.ts中先导入database.ts再调用dotenv.config(),则database.ts读取环境变量时,dotenv尚未完成加载。

解决方案

1. 将dotenv纳入生产依赖

执行命令确保dotenv被安装到dependencies:

npm install dotenv --save

2. 指定.env文件的绝对路径

修改index.ts中的dotenv加载代码,明确指定.env的绝对路径,避免工作目录影响:

import dotenv from 'dotenv';
import path from 'path';

// 从项目根目录加载.env,不受当前工作目录影响
dotenv.config({ path: path.resolve(__dirname, '../.env') });

// 之后再导入其他依赖
import express from 'express';
import sequelize from './config/database';
// ... 其他业务代码

3. 调整加载顺序(解决import提升问题)

由于ES模块import会被提升到文件顶部,可改用require确保dotenv先加载:

// 优先加载dotenv
require('dotenv').config({ path: path.resolve(__dirname, '../.env') });

// 再导入其他模块
import express from 'express';
import sequelize from './config/database';
// ... 其他业务代码

4. 生产环境推荐方案(更安全)

生产环境不建议使用.env文件存储敏感信息,直接在运行环境中配置环境变量:

# 运行时直接传递环境变量
PORT=3000 POSTGRES_URL=postgres://default:****@*****:5432/verceldb?sslmode=require node dist/index.js

也可通过服务器环境变量、Docker容器变量或云平台配置面板设置,避免敏感信息暴露。

验证步骤

  1. 重新安装依赖并构建:
npm install
npm run build
  1. 在项目根目录运行生产版本:
node dist/index.js

内容的提问来源于stack exchange,提问作者Tauseef Razaq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 00:43:10