ทำไมการสร้าง Production Build จึงไม่อ่านตัวแปร .env ใน Node.js (TypeScript)?
ฉันกำลังมีปัญหากับโปรเจกต์ Node.js ด้านหลังของฉันที่เขียนด้วย TypeScript ในเครื่อง ทุกอย่างทำงานได้ดี และตัวแปรสภาพแวดล้อมที่กำหนดไว้ในไฟล์ .env ถูกโหลดอย่างถูกต้องโดยใช้แพ็กเกจ dotenv อย่างไรก็ตาม หลังจากสร้างโปรเจกต์สำหรับใช้งานจริง ตัวแปรสภาพแวดล้อมดูเหมือนไม่ถูกโหลดเมื่อฉันรันไฟล์ JavaScript ที่สร้างขึ้น
โครงสร้างโครงการ:
ฉันกำลังใช้ dotenv เพื่อนำเข้าตัวแปรสภาพแวดล้อมในไฟล์ index.ts ของฉัน ไฟล์ index.ts ของฉันทำการเริ่มต้นเซิร์ฟเวอร์ Express และเชื่อมต่อกับฐานข้อมูล PostgreSQL โดยใช้ Sequelize หลังจากสร้างโปรเจกต์ด้วยคำสั่ง 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 จะสร้างไฟล์ JavaScript ในไดเรกทอรี dist/
เมื่อฉันพยายามรันการสร้างในโหมดโปรดักชันด้วยคำสั่ง 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 ถึงไม่ถูกโหลดในเวอร์ชันผลิต และฉันจะแก้ไขได้อย่างไร?
คำตอบ #1
ปัญหาคือเมื่อคุณรันการสร้าง มันจะไม่สร้าง .env ในโฟลเดอร์ dist
คุณสามารถมีสคริปต์เพื่อคัดลอก .env ไปยังโฟลเดอร์ dist
"build": "cp .env ./dist/.env && tsc build"
