process.env.NODE_ENV không xác định


168

Tôi đang cố gắng làm theo một hướng dẫn về NodeJs. Tôi không nghĩ rằng tôi đã bỏ lỡ bất cứ điều gì nhưng bất cứ khi nào tôi gọi process.env.NODE_ENVgiá trị duy nhất tôi nhận được là không xác định. Theo nghiên cứu của tôi, giá trị mặc định phải là 'phát triển'. Giá trị này được đặt động như thế nào và được đặt ở đâu ban đầu?


để đặt NODE_ENV cho các ứng dụng heroku bạn có thể sử dụng:heroku config:set NODE_ENV="production"
Connor Leech

14
Mặc dù các câu trả lời dưới đây sẽ giải quyết vấn đề tạm thời bằng cách đặt biến môi trường, nhưng bài học lớn hơn ở đây là bạn không bao giờ có thể biết liệu có biến môi trường nào được đặt không ... Vì vậy, hãy viết mã của bạn cho phù hợp và kiểm tra xem nó có được đặt hay không và nếu có, để làm gì Đừng đưa ra giả định về nó.
Stijn de Witt

Câu trả lời:


193

process.env là một tham chiếu đến môi trường của bạn, vì vậy bạn phải đặt biến ở đó.

Để đặt biến môi trường trong Windows :

SET NODE_ENV=development

trên OS X hoặc Linux :

export NODE_ENV=development

4
bạn có thể thêm rằng nếu NODE_ENV không được đặt ứng dụng hoạt động như trong chế độ "phát triển"
Rocco

1
Đối với Linux, vi ~ / .bash_profile, sau đó chèn NODE_ENV = phát triển và lưu.
stonyau

6
Trong trường hợp bất kỳ ai khác đấu tranh ... có một sự khác biệt giữa "SET V = VAL" và "SET V = VAL". Vấn đề không gian.
willem

4
Lưu ý rằng mô-đun "cross-env" để làm tương tự như trên và nó sẽ hoạt động trên cả OSX và Windows: "cross-env NODE_ENV = Development". Bạn cần cài đặt cross-env trước: "npm install cross-env --save". Có một tập lệnh trong gói.json của bạn và bạn tốt để đi trên cả hai nền tảng.
Antonio Brandao

6
Không làm việc cho tôi. Tôi đã thực hiện export NODE_ENV=developmenttrên thiết bị đầu cuối Mac của mình trước khi thực hiện react-native run-iostừ cùng một thiết bị đầu cuối. Khi gỡ lỗi, giá trị của process.env.NODE_ENVkhông xác định.
Tro

58

lời khuyên

trong package.json:

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

trong 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) 

vì vậy, điều này có thể tốt hơn:

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

hoặc là

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

2
Những gì bạn có thể làm được điều này, vì vậy bạn không cần phải cắt ngắn:"start": "set NODE_ENV=dev&& node app.js"
Z. Khullah

Quan sát tuyệt vời, console.log(process.env.NODE_ENV.length) // 4 (bao gồm một khoảng
trắng

1
Điều này an toàn hơn : console.log(('' + process.env.NODE_ENV).trim() === 'dev') // true, vì nó sẽ không gây ra lỗi ngay cả khi process.env.NODE_ENV không được xác định.
gregn3

52

Đối với những người sử dụng * nix (Linux, OS X, v.v.), không có lý do gì để thực hiện điều đó thông qua lệnh xuất thứ hai, bạn có thể xâu chuỗi nó như một phần của lệnh gọi:

NODE_ENV=development node server.js

Dễ dàng hơn, không? :)


3
Một gói như cross-env cũng sẽ cho phép nó hoạt động trên windows.
walkerrandophsmith

34

Chúng tôi gặp vấn đề này khi làm việc với nút trên Windows.

Thay vì yêu cầu bất kỳ ai cố gắng chạy ứng dụng để đặt các biến này, chúng tôi đã cung cấp dự phòng trong ứng dụng.

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

Trong môi trường sản xuất, chúng tôi sẽ định nghĩa nó theo các phương thức thông thường (SET / export).


2
Đây là giải pháp thực dụng nhất.
druskacik

12

Bạn có thể sử dụng chéo gói npm . Nó sẽ đảm nhiệm việc cắt xén biến môi trường và cũng sẽ đảm bảo nó hoạt động trên các nền tảng khác nhau.

Trong thư mục gốc, chạy:

npm install cross-env

Sau đó, trong gói.json của bạn, dưới tập lệnh, thêm:

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

Sau đó, trong thiết bị đầu cuối của bạn, tại thư mục gốc của dự án, hãy khởi động ứng dụng của bạn bằng cách chạy:

npm start

Biến môi trường sau đó sẽ có sẵn trong ứng dụng của bạn process.env.NODE_ENV, vì vậy bạn có thể làm một cái gì đó như:

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

Tôi không nghĩ rằng nó hoạt động. Đã thử nó trong dự án hiện tại của tôi và NODE_ENV vẫn chưa được xác định. Điều này có thể cần thêm một số cấu hình để làm việc có vẻ như.
Aakash Thakur

1
Tôi đã tìm kiếm khoảng hai giờ để tìm câu trả lời này, cảm ơn bạn!
Bob

cài đặt npm --save-dev cross-env
DalSoft

9

trong gói.json, chúng ta phải cấu hình như bên dưới (hoạt động trong Linux và Mac OS)

điều quan trọng là "export NODE_ENV = sản xuất" sau khi các lệnh xây dựng của bạn bên dưới là một ví dụ:

  "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",
  } 
  • Đối với môi trường dev, chúng ta phải nhấn lệnh "npm run dev"

  • Đối với môi trường sản xuất, chúng ta phải nhấn lệnh "npm run start"


9

Trong macOS cho những ai đang sử dụng phiên bản express 4.x.xvà sử dụng DOTENVplugin, cần sử dụng như thế này:

  1. Sau khi cài đặt nhập plugin như sau trong tệp nơi bạn khởi tạo ứng dụng: require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. Trong thư mục gốc, tạo một tệp '.env' và thêm các biến như:

    NODE_ENV=development hoặc là NODE_ENV = development



1

Đó là do hệ điều hành

Trong gói.json của bạn, hãy đảm bảo có các tập lệnh của bạn (Trong đó app.js là tệp js chính của bạn sẽ được thực thi & NODE_ENV được khai báo trong tệp .env) .Eg:

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

Cho cửa sổ

Đồng thời thiết lập biến tệp .env của bạn có NODE_ENV = Development

Nếu tệp .env của bạn nằm trong một thư mục cho thư mục eg.config, hãy đảm bảo chỉ định trong app.js (tệp js chính của bạn)

const dotenv = Yêu cầu ('dotenv'); dotenv.config ({đường dẫn: './config/config.env'});


0

Nếu bạn phải đối mặt với vấn đề này trong React, bạn cần Reac-scripts@0.2.3 trở lên. Ngoài ra, đối với các biến môi trường khác ngoài NODE_ENVhoạt động trong React, chúng cần được thêm tiền tố vào REACT_APP_.


0

Càng sớm càng tốt trong ứng dụng của bạn, yêu cầu và cấu hình dotenv.

require('dotenv').config()


-3

Bạn cũng có thể đặt nó theo mã, ví dụ:

process.env.NODE_ENV = 'test';


67
Tôi thực sự không khuyến khích bất cứ ai thay đổi định danh môi trường trong logic ứng dụng. Bạn không bao giờ muốn ứng dụng đột nhiên nghĩ rằng nó là một cái gì đó khác hơn nó thực sự. Điều này chỉ nên được thay đổi ở cấp độ hệ thống, như nhiều câu trả lời khác cho thấy.
Kafoso

7
Bạn có thể muốn đọc khoảng 12 ứng dụng nhân tố: 12factor.net/config . Mã này sẽ vi phạm điều đó. Có nhiều lý do tốt để giữ cấu hình của bạn tách biệt với mã của bạn.
jcollum

1
Nó có thể chỉ hữu ích cho thử nghiệm tự động, nhưng ngay cả sau đó nó có thể được trừu tượng hóa và được đưa vào mã chính của bạn, thay vì được đọc trực tiếp từ env.
Angelos Pikoulas

Chúng ta đừng hạ thấp câu trả lời này đến mức nhận xét thông tin của @Kafoso bị giảm bớt. Hoặc thêm thông tin này vào một số câu trả lời được bình chọn tốt.
Vibhor Dube
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.