我用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
我尝试过的:
-
验证这一点
dotenv.config()
被称为我的顶部
index.ts
文件。
-
确保
.env
文件存在于根目录中。
-
检查部署环境以确保
.env
文件配置正确且可访问。
为什么我的环境变量不是来自
.env
文件正在生产构建中加载,我该如何修复此问题?