ค้นหาเว็บไซต์

ทำไมการสร้าง 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

สิ่งที่ฉันได้ลอง:

  1. กำลังตรวจสอบว่า dotenv.config() ถูกเรียกที่ด้านบนของไฟล์ index.ts ของฉัน
  2. ตรวจสอบให้แน่ใจว่าไฟล์ .env มีอยู่ในไดเรกทอรีราก
  3. กำลังตรวจสอบสภาพแวดล้อมการปรับใช้งานเพื่อให้แน่ใจว่าไฟล์ .env ถูกกำหนดค่าอย่างถูกต้องและเข้าถึงได้

ทำไมตัวแปรสภาพแวดล้อมของฉันจากไฟล์ .env ถึงไม่ถูกโหลดในเวอร์ชันผลิต และฉันจะแก้ไขได้อย่างไร?

คำตอบ #1

ปัญหาคือเมื่อคุณรันการสร้าง มันจะไม่สร้าง .env ในโฟลเดอร์ dist

คุณสามารถมีสคริปต์เพื่อคัดลอก .env ไปยังโฟลเดอร์ dist

"build": "cp .env ./dist/.env && tsc build"