process.env.NODE_ENV ไม่ได้ถูกกำหนด


169

ฉันกำลังพยายามติดตามการสอนเกี่ยวกับ NodeJs ฉันไม่คิดว่าฉันจะพลาดอะไร แต่เมื่อใดก็ตามที่ฉันโทรหาprocess.env.NODE_ENVสิ่งเดียวที่ฉันได้รับกลับมาจะไม่ได้กำหนด จากการวิจัยของฉันค่าเริ่มต้นควรเป็น 'การพัฒนา' ค่านี้ถูกตั้งค่าแบบไดนามิกอย่างไรและตั้งไว้ที่ใดในตอนแรก


เพื่อตั้งค่า NODE_ENV สำหรับแอพ heroku ที่คุณสามารถใช้:heroku config:set NODE_ENV="production"
Connor Leech

14
แม้ว่าคำตอบด้านล่างจะแก้ปัญหาชั่วคราวด้วยการตั้งค่าตัวแปรสภาพแวดล้อมบทเรียนที่ใหญ่กว่าที่นี่คือคุณไม่สามารถรู้ได้ว่าจะตั้งค่าตัวแปรสภาพแวดล้อมใด ๆ ... ดังนั้นให้เขียนโค้ดของคุณตามนั้นและทดสอบว่ามีการตั้งค่าไว้หรือไม่ คืออะไร. อย่าตั้งสมมติฐานเกี่ยวกับมัน
Stijn de Witt

คำตอบ:


193

process.env เป็นการอ้างอิงถึงสภาพแวดล้อมของคุณดังนั้นคุณต้องตั้งค่าตัวแปรที่นั่น

ในการตั้งค่าตัวแปรสภาพแวดล้อมใน Windows :

SET NODE_ENV=development

บน OS X หรือLinux :

export NODE_ENV=development

4
คุณอาจจะเพิ่มว่าถ้า NODE_ENV ไม่ได้กำหนดพฤติกรรมของแอปอย่างเช่นในโหมด "การพัฒนา"
ร็อคโค

1
สำหรับ Linux, vi ~ / .bash_profile จากนั้นใส่ NODE_ENV = development และบันทึก
stonyau

6
ในกรณีที่คนอื่นดิ้นรน ... มีความแตกต่างระหว่าง "SET V = VAL" และ "SET V = VAL" ช่องว่างสำคัญ
วิลเล็ม

4
โปรดทราบว่าโมดูล "cross-env" ทำคล้ายกับด้านบนและจะทำงานได้ทั้ง OSX และ Windows: "cross-env NODE_ENV = development" คุณต้องติดตั้ง cross-env ก่อน: "npm install cross-env --save" มีไว้ในสคริปต์ใน package.json ของคุณและคุณก็พร้อมใช้งานบนทั้งสองแพลตฟอร์ม
อันโตนิโอ Brandao

6
ไม่ได้ผลสำหรับฉัน ฉันดำเนินการexport NODE_ENV=developmentบนเทอร์มินัล Mac ของฉันก่อนที่จะทำreact-native run-iosจากเทอร์มินัลเดียวกัน เมื่อทำการดีบั๊กค่าของprocess.env.NODE_ENVจะไม่ได้กำหนด
Ash

58

เคล็ดลับ

ในpackage.json:

"scripts": {
  "start": "set NODE_ENV=dev && node app.js"
 }

ในapp.js:

console.log(process.env.NODE_ENV) // dev
console.log(process.env.NODE_ENV === 'dev') // false
console.log(process.env.NODE_ENV.length) // 4 (including a space at the end) 

ดังนั้นสิ่งนี้อาจดีกว่า:

"start": "set NODE_ENV=dev&& node app.js"

หรือ

console.log(process.env.NODE_ENV.trim() === 'dev') // true

2
คุณสามารถทำสิ่งนี้ได้ดังนั้นคุณไม่ต้องตัดแต่ง:"start": "set NODE_ENV=dev&& node app.js"
Z. Khullah

การสังเกตที่ยอดเยี่ยมconsole.log(process.env.NODE_ENV.length) // 4 (รวมช่องว่างท้าย)
gregn3

1
สิ่งนี้ปลอดภัยกว่า: console.log(('' + process.env.NODE_ENV).trim() === 'dev') // trueเนื่องจากจะไม่เกิดข้อผิดพลาดแม้ว่าprocess.env.NODE_ENVจะไม่ถูกกำหนด
gregn3

52

สำหรับผู้ที่ใช้ * nix (Linux, OS X, ฯลฯ ) ไม่มีเหตุผลที่จะทำผ่านคำสั่งส่งออกที่สองคุณสามารถโยงมันเป็นส่วนหนึ่งของคำสั่งที่เรียกใช้:

NODE_ENV=development node server.js

ง่ายกว่านี้ไหม :)


3
แพ็คเกจเช่น cross-env จะช่วยให้สามารถทำงานบน windows ได้เช่นกัน
walkerrandophsmith

35

เราพบปัญหานี้เมื่อทำงานกับโหนดบน Windows

แทนที่จะกำหนดให้ทุกคนที่พยายามเรียกใช้แอปตั้งค่าตัวแปรเหล่านี้เราได้จัดเตรียมทางเลือกไว้ภายในแอปพลิเคชัน

var environment = process.env.NODE_ENV || 'development';

ในสภาพแวดล้อมการผลิตเราจะกำหนดตามวิธีปกติ (SET / export)


3
นี่คือทางออกที่จริงจังที่สุด
druskacik

12

คุณสามารถใช้แพ็กเกจcross-env npm มันจะดูแลการปรับแต่งตัวแปรสภาพแวดล้อมและจะตรวจสอบให้แน่ใจว่ามันทำงานบนแพลตฟอร์มที่แตกต่างกัน

ในรูทโปรเจ็กต์ให้รัน:

npm install cross-env

จากนั้นใน package.json ของคุณภายใต้สคริปต์ให้เพิ่ม:

"start": "cross-env NODE_ENV=dev node your-app-name.js"

จากนั้นในเทอร์มินัลของคุณที่รูทโปรเจคเริ่มต้นแอปของคุณโดยเรียกใช้:

npm start

ตัวแปรสภาพแวดล้อมจะพร้อมใช้งานในแอปของคุณprocess.env.NODE_ENVแล้วดังนั้นคุณสามารถทำสิ่งต่อไปนี้:

if (process.env.NODE_ENV === 'dev') {
  // Your dev-only logic goes here
}

ฉันไม่คิดว่ามันจะใช้งานได้ พยายามในโครงการปัจจุบันของฉันและ NODE_ENV ยังไม่ได้กำหนด อาจต้องใช้การกำหนดค่าเพิ่มเติมเพื่อให้ทำงานได้
Aakash Thakur

npm install --save-dev cross-env
DalSoft

9

ใน package.json เราต้องทำการตั้งค่าดังนี้ (ทำงานได้กับ Linux และ Mac OS)

สิ่งสำคัญคือ "export NODE_ENV = production" หลังจากคำสั่ง build ของคุณด้านล่างเป็นตัวอย่าง:

  "scripts": {
     "start": "export NODE_ENV=production && npm run build && npm run start-server",
     "dev": "export NODE_ENV=dev && npm run build && npm run start-server",
  } 
  • สำหรับสภาพแวดล้อม dev เราต้องกดคำสั่ง "npm run dev"

  • สำหรับสภาพแวดล้อมการผลิตเราต้องกดคำสั่ง "npm run start"


9

ในmacOSสำหรับผู้ใช้รุ่นเอ็กซ์เพรส4.x.xและใช้DOTENVปลั๊กอินจำเป็นต้องใช้สิ่งนี้:

  1. หลังจากติดตั้งการนำเข้าปลั๊กอินดังต่อไปนี้ในไฟล์ที่คุณเริ่มแอปพลิเคชัน: require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. ในไดเรกทอรีรากสร้างไฟล์ '.env' และเพิ่ม varaiable like:

    NODE_ENV=development หรือ NODE_ENV = development



1

มันเกิดจากระบบปฏิบัติการ

ใน package.json ของคุณตรวจสอบให้แน่ใจว่าคุณมีสคริปต์ของคุณ (โดยที่ app.js เป็นไฟล์ js หลักของคุณที่จะดำเนินการ & NODE_ENV ถูกประกาศในไฟล์. env)

"scripts": {
    "start": "node app.js",
    "dev": "nodemon server.js",
    "prod": "NODE_ENV=production & nodemon app.js"
  }

สำหรับ windows

ตั้งค่าตัวแปร. env ของคุณด้วย NODE_ENV = การพัฒนา

หากไฟล์. env ของคุณอยู่ในโฟลเดอร์สำหรับ eg.config ตรวจสอบให้แน่ใจว่าได้ระบุใน app.js (ไฟล์ js หลักของคุณ)

const dotenv = ต้องการ ('dotenv'); dotenv.config ({path: './config/config.env'});


0

หากคุณประสบปัญหานี้ในการตอบสนองคุณต้อง react-scripts@0.2.3 และสูงกว่า นอกจากนี้สำหรับตัวแปรสภาพแวดล้อมอื่น ๆ นอกเหนือจากการทำงานในการตอบสนองพวกเขาจะต้องนำหน้าด้วยNODE_ENVREACT_APP_


0

เร็วที่สุดเท่าที่จะเป็นไปได้ในแอปพลิเคชันของคุณต้องการและกำหนดค่า dotenv

require('dotenv').config()


-3

คุณยังสามารถตั้งค่าด้วยรหัสตัวอย่างเช่น:

process.env.NODE_ENV = 'test';


67
ฉันขอกีดกันทุกคนจากการเปลี่ยนแปลงตัวระบุสภาพแวดล้อมในแอปพลิเคชันตรรกะ คุณไม่ต้องการให้แอปพลิเคชันคิดว่ามันเป็นอย่างอื่นมากกว่าที่เป็นจริง สิ่งนี้ควรเปลี่ยนในระดับระบบเท่านั้นตามคำตอบอื่น ๆ ที่แนะนำ
Kafoso

7
คุณอาจต้องการที่จะอ่านประมาณ 12 แอพพลิเคปัจจัย: 12factor.net/config รหัสนี้จะเป็นการละเมิดที่ มีเหตุผลที่ดีในการแยกการกำหนดค่าของคุณออกจากรหัสของคุณ
jcollum

1
มันอาจจะมีประโยชน์สำหรับการทดสอบอัตโนมัติเท่านั้น แต่ถึงอย่างนั้นมันก็อาจถูกทำให้เป็นนามธรรมและฉีดเข้าไปในรหัสหลักของคุณแทนที่จะอ่านโดยตรงจาก env
Angelos Pikoulas

อย่าลดคำตอบลงมากจนความคิดเห็นที่ให้ข้อมูลโดย @Kafoso ลดน้อยลง หรือเพิ่มข้อมูลนี้ลงในคำตอบที่ได้รับการโหวตอย่างดี
Vibhor Dube
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.