2011-12-09 32 views
48

Làm thế nào để bạn phát hiện ra môi trường nào ứng dụng expressJS đang chạy? (phát triển, thử nghiệm, sản xuất?). Không có gì trong process.env chỉ ra một môi trường ...Làm cách nào để bạn phát hiện môi trường trong ứng dụng express.js?

Tôi biết rằng bạn có thể khai báo các biến trong tập tin cấu hình của bạn theo từng môi trường, nhưng điều đó không giúp đỡ nếu bạn đang tự động nạp module là ...

Trả lời

60

Bạn có thể kiểm tra môi trường bằng cách kiểm tra app.settings.env (điều này sẽ hoạt động trong Express) hoặc bạn có thể thực hiện theo cách trực tiếp hơn bằng cách kiểm tra process.env.NODE_ENV (môi trường là một trong tìm thấy trong biến đó hoặc 'phát triển' mặc định < điều này cũng hoạt động trong các thư viện khác như Socket.IO, v.v.).

+1

cảm ơn! Tôi đã chạy trong phát triển, vì vậy NODE_ENV không bao giờ có mặt. Tôi không có quyền truy cập vào 'ứng dụng' bên trong mã tôi đang viết, nhưng việc kiểm tra NODE_ENV và mặc định là' development' hoạt động – sethvargo

+0

Tôi có thể làm điều đó từ Gruntfile.js bằng cách nào? Tôi đã thử cả hai nhưng ứng dụng không được định nghĩa và process.env.NODE_ENV không xác định. Có cách nào? – Vadorequest

+0

Tốt hơn nên thiết lập nó trong 'bashrc': http://www.hacksparrow.com/running-express-js-in-production-mode.html – alessioalex

2

Có thể phát hiện bạn đang ở trong môi trường nào bằng cách kiểm tra app.settings.env.

+1

điều này không hoạt động nếu bạn không có quyền truy cập để diễn tả (như trong mô-đun tùy chỉnh lib) – sethvargo

+3

@sethvargo Môi trường cần được tiêm vào mô-đun, thông qua hàm tạo hoặc phương pháp tiêm. ví dụ. myModule.doSomething (app.settings.env). Nếu mô-đun này là mã cấp thấp hơn được gọi từ mã mức cao hơn, thì giá trị cần được chuyển xuống ngăn xếp cuộc gọi. –

21

app.get ('env') cũng sẽ trả về môi trường.

if (app.get('env') === 'development') { 
    app.use(express.errorHandler()); 
} 
+13

Nhưng làm sao nó biết được? Nơi nào thể hiện nhìn để tìm hiểu những gì 'env' đã được thiết lập để. Tôi chưa đặt mã trong mã của ứng dụng. – Costa

+2

@Costa nó được đặt trong vỏ Unix là biến môi trường 'NODE_ENV'. Lưu ý ** thuật ngữ 'env' ở đây gây nhầm lẫn quá tải **: môi trường Unix, nơi cài đặt cho các ứng dụng đôi khi được lưu trữ, cũng như cài đặt môi trường NODE_ENV xác định sản xuất, phát triển, v.v. – mikemaccana

+1

@mikemaccana, Ah, hiểu rồi. Thuật ngữ "quá tải" giải thích rất nhiều ở đó. Cảm ơn rất nhiều! – Costa

9

Tôi muốn giải quyết một cách đơn giản để đi qua các biến NODE_ENV để kịch bản nút của bạn để truy cập chúng trong process.env

"scripts": { 
    "start": "./node_modules/.bin/cross-env NODE_ENV=development ./node_modules/.bin/nodemon server.js", 
    "debug": "./node_modules/.bin/cross-env NODE_ENV=development ./node_modules/.bin/nodemon --debug server.js", 
    "test": "./node_modules/.bin/cross-env NODE_ENV=test ./node_modules/.bin/babel-tape-runner test/test-*.js" 
    }, 

có thể được sử dụng như

if (app.get('env') === 'development') { 
    app.use(express.errorHandler()); 
} 
0

không thể truy cập máy chủ nodejs. có thể phát hiện nút env từ nhanh sử dụng app.setting.env

  1. var app = express();
  2. app.setting.env trả cho các mẫu động cơ.
  3. kiểm tra từ trình duyệt.
0

Có nhiều đề xuất hữu ích trong các câu trả lời khác. Tôi thường làm như sau:

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

Điều tốt là cách tiếp cận này không cụ thể cho Express, nhưng thực sự là một thực tiễn được chấp nhận trong hệ sinh thái Node.js rộng hơn.

Ngoài ra, tôi đã triển khai mô-đun có thể tái sử dụng, cho phép tự động phát hiện môi trường bằng cách phân tích cả đối số CLI và biến NODE_ENV. Điều này có thể hữu ích trên máy phát triển của bạn, bởi vì bạn có thể dễ dàng thay đổi môi trường bằng cách chuyển đối số CLI cho bạn chương trình Node.js như thế này: $ node app.js --prod.

Vui lòng xem thêm chi tiết và sử dụng các trường hợp trên detect-environment's page.

Các vấn đề liên quan