NODE_ENV là gì và cách sử dụng nó trong Express?


184

Đây là ứng dụng của tôi, tôi hiện đang chạy trên sản xuất.

var app = express();
app.set('views',settings.c.WEB_PATH + '/public/templates');
app.set('view engine','ejs');
app.configure(function(){
    app.use(express.favicon());
    app.use(express.static(settings.c.WEB_PATH + '/public'));
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.methodOverride());
    app.use(express.session({
            cookie:{ domain:"."+settings.c.SITE_DOMAIN, maxAge:1440009999},
            secret:'hamster',
            store: r_store,
            }));
    app.use(useragent.express());
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());
});

Tuy nhiên, tôi đã biết NODE_ENVvà muốn sử dụng nó. Tôi có thể làm cái này như thế nào?


Trong trường hợp của bạn, tôi giả sử những gì bạn có thể sử dụng là app.configure('development', ...)hoặc "sản xuất" để chỉ cài đặt một số cài đặt nhất định cho môi trường phát triển hoặc sản xuất. Xem expressjs.com/api.html#app.configure
Andreas Hultgren

Câu trả lời:


360

NODE_ENVlà một biến môi trường được phổ biến bởi khung máy chủ web nhanh . Khi một ứng dụng nút được chạy, nó có thể kiểm tra giá trị của biến môi trường và thực hiện các việc khác nhau dựa trên giá trị. NODE_ENVcụ thể được sử dụng (theo quy ước) để nêu rõ một môi trường cụ thể là môi trường sản xuất hay môi trường phát triển . Một trường hợp sử dụng phổ biến là chạy mã gỡ lỗi hoặc mã đăng nhập bổ sung nếu chạy trong môi trường phát triển.

Truy cập NODE_ENV

Bạn có thể sử dụng mã sau đây để tự truy cập vào biến môi trường để bạn có thể thực hiện kiểm tra và logic của riêng mình:

var environment = process.env.NODE_ENV

Hoặc thay thế bằng cách sử dụng express ' app.get('env')( lưu ý: điều này mặc định là "development")

Xin lưu ý rằng nếu bạn chưa thiết lập rõ ràng NODE_ENVcho môi trường của mình, thì nó sẽ như vậy undefined.

Đặt NODE_ENV

Cách thực sự đặt biến môi trường thay đổi từ hệ điều hành sang hệ điều hành và cũng phụ thuộc vào thiết lập người dùng của bạn.

Nếu bạn muốn đặt biến môi trường là một lần, bạn có thể làm như vậy từ dòng lệnh:

  • linux & mac :export NODE_ENV=production
  • cửa sổ :$env:NODE_ENV = 'production'

Về lâu dài, bạn nên duy trì điều này để nó không bị hủy nếu bạn khởi động lại - thay vì liệt kê tất cả các phương pháp có thể để thực hiện việc này, tôi sẽ cho phép bạn tự tìm kiếm cách thực hiện điều đó!

Công ước đã ra lệnh rằng chỉ có hai giá trị bạn nên sử dụng cho NODE_ENV, productionhoặc development, tất cả chữ thường. Không có gì ngăn bạn thêm nhiều giá trị, nhưng có lẽ đó không phải là ý hay, vì tôi thấy rất nhiều loại mã này trong nhiều nút_modules mà tôi sử dụng:

var development = process.env.NODE_ENV !== 'production';

Lưu ý rằng đó là một ý tưởng thực sự tồi tệ khi cố gắng thiết lập NODE_ENVtừ bên trong một ứng dụng nút - nếu bạn thực hiện nó sẽ chỉ áp dụng cho quy trình mà nó được đặt , vì vậy mọi thứ có thể sẽ không hoạt động như bạn mong đợi. Đừng làm điều đó - bạn sẽ hối tiếc.


5
Trong Express 4, app.configure()đã bị xóa. Các hướng dẫn di chuyển Express 4 khuyến cáo để "sử dụng process.env.NODE_ENVhoặc app.get('env')để phát hiện môi trường và cấu hình ứng dụng phù hợp."
Chris Bartley

3
Tôi nghĩ rằng tốt nhất là sử dụng app.get ('env') bởi vì nếu môi trường không xác định được nút mặc định là dev, nơi chỉ cần kiểm tra biến bạn sẽ không xác định
light24bulbs

11
Điểm tốt - Tôi đã thêm một ghi chú để làm nổi bật mặc định. Tuy nhiên, cảm nhận cá nhân của tôi là bạn không nên sử dụng app.get('env')chính xác lý do đó. Nó che đậy rằng biến quan trọng này không được đặt - làm cho mọi thứ dường như không nhất quán khi bạn truy cập nó từ bên ngoài nhanh. Hơn nữa, tôi nghĩ rằng việc gỡ lỗi mã vô tình không chạy trên môi trường phát triển sẽ ít gây hại hơn so với việc nó vô tình chạy trên môi trường sản xuất.
Ed Hinchliffe

5
Tôi đã đo lường tác động của việc bỏ qua cài đặt NODE_ENV trong các ứng dụng cấp tốc. Nó mặc định development- trong số những thứ khác - có nghĩa là các mẫu sẽ được xử lý lại cho mọi yêu cầu. Hậu quả là hiệu suất tăng hoặc giảm ~ 75% giữa sản xuất và phát triển khi sử dụng Jade. Tôi cũng đã tạo một bài đăng blog trên đó apmblog.dynatrace.com/2015/07/22/...
DanielKhan

8
Tôi nghĩ đối với các dự án cấp tốc, ngoài "sản xuất" và "phát triển", ít nhất bạn cần một "thử nghiệm" khác để chạy thử nghiệm tự động. Bạn có thể muốn sử dụng một DB khác cho dữ liệu thử nghiệm được điền.
dawnstar

19

NODE_ENV là một biến môi trường đại diện cho môi trường nút trong máy chủ tốc hành.

Đó là cách chúng ta thiết lập và phát hiện môi trường chúng ta đang ở.

Nó rất phổ biến sử dụng productiondevelopment.

Bộ:

export NODE_ENV=production

Được:

Bạn có thể lấy nó bằng cách sử dụng app.get('env')


11

Tôi giả sử câu hỏi ban đầu bao gồm Express sử dụng biến môi trường này như thế nào.

Express sử dụng NODE_ENV để thay đổi hành vi mặc định của chính nó. Ví dụ, trong chế độ phát triển, trình xử lý lỗi mặc định sẽ gửi lại một stacktrace cho trình duyệt. Trong chế độ sản xuất, phản hồi chỉ đơn giản là Internal Server Errorđể tránh rò rỉ chi tiết triển khai ra thế giới.


0

Thông thường, bạn sẽ sử dụng NODE_ENVbiến để thực hiện các hành động đặc biệt khi bạn phát triển, kiểm tra và gỡ lỗi mã của mình. Ví dụ: để sản xuất ghi nhật ký và gỡ lỗi chi tiết mà bạn không muốn trong sản xuất. Express thể hiện hành vi khác nhau tùy thuộc vào việc NODE_ENVđược đặt thành productionhay không. Bạn có thể thấy điều này nếu bạn đặt những dòng này trong ứng dụng Express và sau đó thực hiện yêu cầu HTTP GET để /error:

app.get('/error', function(req, res) {
  if ('production' !== app.get('env')) {
    console.log("Forcing an error!");
  }
  throw new Error('TestError');
});

app.use(function (req, res, next) {
  res.status(501).send("Error!")
})

Lưu ý rằng cái sau app.use()phải là cuối cùng, sau tất cả các trình xử lý phương thức khác!

Nếu bạn đặt NODE_ENVthành productiontrước khi khởi động máy chủ của mình, sau đó gửi GET /erroryêu cầu đến nó, bạn sẽ không thấy văn bản Forcing an error!trong bảng điều khiển và phản hồi không được chứa dấu vết ngăn xếp trong phần thân HTML (có nguồn gốc từ Express). Nếu, thay vào đó, bạn đặt NODE_ENVthành một thứ khác trước khi khởi động máy chủ của mình, điều ngược lại sẽ xảy ra.

Trong Linux, đặt biến môi trường NODE_ENV như thế này:

xuất NODE_ENV = ' giá trị '

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.