我在使用 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
文件中的环境变量没有加载到生产版本中,我该如何解决这个问题?
问题是当您运行构建时,它不会在 dist 文件夹中生成
.env
。
您可以使用脚本将
.env
复制到 dist 文件夹
"build": "cp .env ./dist/.env && tsc build"