Đặt biến môi trường cho nút để lấy


414

Tôi đang cố gắng làm theo một hướng dẫn và nó nói:

Có một vài cách để tải thông tin đăng nhập.

  1. Được tải từ các biến môi trường,
  2. Được tải từ tệp JSON trên đĩa,

Các phím cần phải như sau:

USER_ID, USER_KEY

... Điều này có nghĩa là nếu bạn đặt đúng các biến môi trường của mình, bạn hoàn toàn không cần phải quản lý thông tin đăng nhập trong ứng dụng của mình.

Dựa trên một số Googling, có vẻ như tôi cần đặt các biến trong process.env? Làm thế nào và ở đâu để tôi đặt các thông tin này? Ví dụ xin vui lòng.

Câu trả lời:


397

Các biến môi trường (trong trường hợp này) đang được sử dụng để chuyển thông tin đăng nhập cho ứng dụng của bạn. USER_IDUSER_KEYcả hai có thể được truy cập từ process.env.USER_IDprocess.env.USER_KEYtương ứng. Bạn không cần chỉnh sửa chúng, chỉ cần truy cập nội dung của chúng.

Có vẻ như họ chỉ đơn giản là cung cấp cho bạn sự lựa chọn giữa việc tải của bạn USER_IDUSER_KEYtừ một process.envhoặc một số tệp cụ thể trên đĩa.

Bây giờ, điều kỳ diệu xảy ra khi bạn chạy ứng dụng.

USER_ID=239482 USER_KEY=foobar node app.js

Điều đó sẽ vượt qua id người dùng 239482và khóa người dùng là foobar. Điều này phù hợp để thử nghiệm, tuy nhiên để sản xuất, có thể bạn sẽ định cấu hình một số tập lệnh bash để xuất các biến.


26
Nếu bạn đang sử dụng fishthay vì bash, bạn cần sử dụng : env USER_ID=239482 my_command. Ví dụ: để đặt các biến môi trường cho debugthư viện của node.js : env DEBUG='*' node some_file.js fishshell.com/docs/civerse/faq.html#faq-single-env
SilentSteel

1
Tôi thấy rằng tôi phải xóa các trích dẫn xung quanh "*" để nó hoạt động:env DEBUG=* node some_file.js
divillysausages

@SamT làm thế nào để thiết lập các biến này trong Ubuntu linux?
Mohammed Zameer

1
Có thể thêm một tệp thay vì thêm một số lượng lớn các tập lệnh env hoặc người dùng unix có cần tạo tập lệnh bash không?
mibbit

@mibbit có, đó dotenvlà tất cả những gì về nó, vì nó sẽ đọc .envtệp của bạn và áp dụng nó.
balexandre

200

Tôi rất khuyên bạn nên nhìn vào gói dotenv.

https://github.com/motdotla/dotenv

Nó tương tự như thư viện được đề xuất trong câu trả lời từ @Benxamin, nhưng nó sạch hơn rất nhiều và không yêu cầu bất kỳ tập lệnh bash nào. Cũng đáng lưu ý rằng cơ sở mã là phổ biến và duy trì tốt.

Về cơ bản, bạn cần một tệp .env (mà tôi đặc biệt khuyên bạn nên bỏ qua git / mercurial / etc) của bạn:

FOO=bar
BAZ=bob

Sau đó, trong tệp nhập ứng dụng của bạn, hãy đặt dòng sau càng sớm càng tốt:

require('dotenv').config();

Bùng nổ. Làm xong. 'process.env' bây giờ sẽ chứa các biến ở trên:

console.log(process.env.FOO);
// bar

Tệp '.env' không bắt buộc, do đó bạn không cần lo lắng về việc ứng dụng của mình bị đổ khi thiếu.


1
Mặc dù nếu bạn đặt các chi tiết cấu hình có liên quan mà ứng dụng của bạn yêu cầu (chẳng hạn như câu hỏi này đang tìm hiểu), thì có khả năng nó sẽ rơi vào sự vắng mặt của nó .. nhưng nó vẫn có vẻ là một lựa chọn tốt.
Giăng

6
Nếu bạn đang tìm kiếm sự an toàn bổ sung thì github.com/rolodato/dotenv-safe và một vài thử nghiệm nên làm điều đó.
ctrlplusb

1
Nếu bạn đang tìm kiếm không phải yêu cầu nó trong ứng dụng của mình: github.com/direnv/direnv
AlecRust

100

Chỉ cần cung cấp các giá trị env trên dòng lệnh

USER_ID='abc' USER_KEY='def' node app.js

2
Chỉ cần thêm rằng nó hoạt động với tôi trên Windows với bash shell (cygwin; được cài đặt với các công cụ git tôi nghĩ).
markau 17/03/2016

@TiborSzasz: Cygwin hoặc Powershell nên khắc phục điều đó. Điều này được đề cập hai năm sau, tất nhiên.
orlando marinella

9
Đối với Windows, hãy sử dụng: SET USER_ID = 'abc'
Mike

@Mike, bạn nên đưa ra câu trả lời thích hợp :)
rocketspacer

6
Chúng tôi có thể sử dụng gói cross-env ( npmjs.com/package/cross-env ) để làm cho nó hoạt động trên unix hoặc Windwos
Brij

79

Bạn có thể đặt biến môi trường thông qua quá trình biến toàn cục như sau:

process.env['NODE_ENV'] = 'production';

Hoạt động trong tất cả các nền tảng.


22
... các biến môi trường được dự định được đặt từ bên ngoài mã chứ không phải bên trong - vì vậy điều này đang đánh bại mục đích và một ví dụ tồi tệ
Soren

44
@Soren chương trình nút của chúng tôi khởi chạy tiến trình con được hưởng lợi từ câu trả lời này, vì vậy có những trường hợp sử dụng cho điều này mặc dù nó hơi không chính thống
pspi

2
@pspi - Tôi chắc chắn 99% bạn đang làm sai và trừ khi bạn là tác giả của gói cấu hình như thế này, bạn nên sử dụng gói cấu hình đó thay thế.
Soren

17
Điều này rất hữu ích nếu bạn đang viết các tập lệnh xây dựng trong js và chạy chúng từ npm
Stephen Drew

28
Điều này cũng hữu ích cho việc thiết lập và ghi đè môi trường khi chạy thử nghiệm.
mtkopone

54

Nếu bạn muốn một tùy chọn quản lý, hãy thử gói npm envs . Nó trả về giá trị môi trường nếu chúng được đặt. Mặt khác, bạn có thể chỉ định một giá trị mặc định được lưu trữ trong biến đối tượng mặc định toàn cục nếu nó không nằm trong môi trường của bạn.

Sử dụng .env ("dot ee-en-vee") hoặc các tệp môi trường là tốt vì nhiều lý do. Các cá nhân có thể quản lý các cấu hình riêng của họ. Bạn có thể triển khai các môi trường khác nhau (dev, giai đoạn, prod) lên các dịch vụ đám mây với cài đặt môi trường của riêng chúng. Và bạn có thể đặt mặc định hợp lý.

Trong .envtệp của bạn, mỗi dòng là một mục, như ví dụ này:

NODE_ENV=development
API_URL=http://api.domain.com
TRANSLATION_API_URL=/translations/
GA_UA=987654321-0
NEW_RELIC_KEY=hi-mom
SOME_TOKEN=asdfasdfasdf
SOME_OTHER_TOKEN=zxcvzxcvzxcv

Bạn không nên bao gồm .envkho lưu trữ kiểm soát phiên bản của bạn (thêm nó vào .gitignoretệp của bạn ).

Để nhận các biến từ .envtệp vào môi trường của bạn, bạn có thể sử dụng tập lệnh bash để thực hiện tương đương export NODE_ENV=developmentngay trước khi bạn bắt đầu ứng dụng.

#!/bin/bash
while read line; do export "$line";
done <source .env

Sau đó, điều này đi vào ứng dụng javascript của bạn:

var envs = require('envs');

// If NODE_ENV is not set, 
// then this application will assume it's prod by default.
app.set('environment', envs('NODE_ENV', 'production')); 

// Usage examples:
app.set('ga_account', envs('GA_UA'));
app.set('nr_browser_key', envs('NEW_RELIC_BROWSER_KEY'));
app.set('other', envs('SOME_OTHER_TOKEN));

1
Hmm, tôi đã cố gắng sử dụng gói này nhưng dường như chỉ theo dõi việc sử dụng biến môi trường. Nó không đọc tệp .env ( npmjs.com/package/envs ). Đây có phải là một gói chính xác?
wawka

1
Bạn đúng! Nó không đọc tệp .env. Việc này thật là xấu hổ. Tôi quên rằng tôi đang tải .env với tập lệnh bash như @SamT đã đề cập, vì vậy nó vẫn hoạt động.
Benxamin

1
"Yêu cầu ('envs')"? "Envs" là gì?
CodyBugstein

1
'envs' là tên của một mô-đun nút: npmjs.com/package/envs
Benxamin

4
Ngoài ra, tôi khuyên bạn nên sử dụng mô-đun "dotenv", nó đặt tất cả các biến ENV vào đối tượng Proccess, khá gọn gàng.
Bruno de Oliveira

37

Nó phụ thuộc vào hệ điều hành và vỏ của bạn

Trên linux với shell bash , bạn tạo các biến môi trường như thế này (trong bảng điều khiển):

export FOO=bar

Để biết thêm thông tin về các biến môi trường trên ubfox (ví dụ):

Biến môi trường trên Ubuntu


1
Sau đó, xem câu trả lời này: stackoverflow.com/questions/135688/
Ấn

2
Còn Windows thì sao? Bạn có thể vui lòng thêm ở đây?
YakovL


trong bash Linux có tồn tại lâu không? Điều gì xảy ra nếu tôi chỉ muốn chạy nó trong khi thiết bị đầu cuối đang mở để không gây ra sự cố với các ứng dụng khác sau này?
JesseBoyd

13

Giống như ctrlplusb đã nói, tôi khuyên bạn nên sử dụng gói dotenv, nhưng một cách khác để làm điều này là tạo tệp js và yêu cầu nó trên dòng đầu tiên của máy chủ ứng dụng của bạn.

env.js:

process.env.VAR1="Some value"
process.env.VAR2="Another Value"

app.js:

require('env')
console.log(process.env.VAR1) // Some value

9

Người dùng Windows: chú ý! Các lệnh này được khuyến nghị cho Unix nhưng trên Windows chúng chỉ là tạm thời. Họ chỉ đặt một biến cho vỏ hiện tại, ngay khi bạn khởi động lại máy hoặc khởi động vỏ thiết bị đầu cuối mới, chúng sẽ biến mất.

  • SET TEST="hello world"
  • $env:TEST = "hello world"

Để đặt biến môi trường liên tục trên Windows, thay vào đó bạn phải sử dụng một trong các phương pháp sau:

A) tập tin .env trong dự án của bạn - đây là phương pháp tốt nhất bởi vì điều đó có nghĩa là bạn có thể di chuyển dự án của mình sang các hệ thống khác mà không phải thiết lập các vars môi trường trên hệ thống đó vì bạn có thể chạy mã của mình.

  1. Tạo ra một .env tệp trong thư mục gốc dự án của bạn với nội dung:TEST="hello world"

  2. Viết một số mã nút sẽ đọc tệp đó. Tôi đề nghị cài đặt dotenv (npm install dotenv --save ) và sau đó thêm require('dotenv').config();trong mã thiết lập nút của bạn.

  3. Bây giờ mã nút của bạn sẽ có thể truy cậpprocess.env.TEST

Các tệp Env rất tốt trong việc giữ các khóa api và các bí mật khác mà bạn không muốn có trong cơ sở mã của mình. Chỉ cần chắc chắn để thêm nó vào của bạn .gitignore.

B) Sử dụng Powershell - điều này sẽ tạo ra một biến có thể truy cập được trong các thiết bị đầu cuối khác. Nhưng hãy cẩn thận, biến sẽ bị mất sau khi bạn khởi động lại máy tính.

[Environment]::SetEnvironmentVariable("TEST", "hello world", "User")

Phương pháp này được khuyến nghị rộng rãi trên các diễn đàn Windows, nhưng tôi không nghĩ mọi người biết rằng biến không tồn tại sau khi khởi động lại hệ thống ....

C) Sử dụng GUI Windows

  1. Tìm kiếm "Biến môi trường" trong Menu Bắt đầu Tìm kiếm hoặc trong Bảng điều khiển
  2. Chọn "Chỉnh sửa biến môi trường hệ thống"
  3. Một cuộc đối thoại sẽ mở ra. Nhấp vào nút "Biến môi trường" ở cuối đoạn hội thoại.
  4. Bây giờ bạn đã có một cửa sổ nhỏ để chỉnh sửa các biến. Chỉ cần nhấp vào nút "Mới" để thêm một biến môi trường mới. Dễ dàng.

8

Bước 1: Thêm các biến môi trường của bạn vào tệp thích hợp của chúng. Ví dụ, môi trường dàn của bạn có thể được gọi .env.staging, trong đó có các biến môi trường USER_IDUSER_KEY, cụ thể cho môi trường dàn của bạn.

Bước 2: Trong package.jsontệp của bạn , thêm vào như sau:

"scripts": {
  "build": "sh -ac '. ./.env.${REACT_APP_ENV}; react-scripts build'",
  "build:staging": "REACT_APP_ENV=staging npm run build",
  "build:production": "REACT_APP_ENV=production npm run build",
  ...
}

sau đó gọi nó trong kịch bản triển khai của bạn như thế này:

npm run build:staging

Thiết lập siêu đơn giản và hoạt động như một nét duyên dáng!

Nguồn: https://medium.com/@tacomanator/envirments-with-create-react-app-7b645312c09d


2
@JohnXiao thế nào?
Blairg23


4

Đã qua một công cụ tốt đẹp để làm điều này.

nút-env-file

Phân tích và tải các tệp môi trường (chứa xuất khẩu biến ENV) vào môi trường Node.js, tức là process.env- Sử dụng kiểu này:

.env

# some env variables

FOO=foo1
BAR=bar1
BAZ=1
QUX=
# QUUX=

2

Khi mở rộng câu trả lời @ctrlplusb,
tôi cũng đề nghị bạn xem qua env-dot-propgói.

Nó cho phép bạn thiết lập / nhận các thuộc tính từ process.envviệc sử dụng a dot-path.

Hãy giả sử rằng của bạn process.envcó chứa những điều sau đây:

process.env = {
  FOO_BAR: 'baz'
  'FOO_🦄': '42'
}

Sau đó, bạn có thể thao tác các biến môi trường như thế:

const envDotProp = require('env-dot-prop');

console.log(process.env);
//=> {FOO_BAR: 'baz', 'FOO_🦄': '42'}

envDotProp.get('foo');
//=> {bar: 'baz', '🦄': '42'}

envDotProp.get('foo.🦄');
//=> '42'

envDotProp.get('foo.🦄', {parse: true});
//=> 42

envDotProp.set('baz.foo', 'bar');
envDotProp.get('', {parse: true});
//=> {foo: {bar: 'baz', '🦄': 42}, baz: {foo: 'bar'}}

console.log(process.env);
//=> {FOO_BAR: 'baz', 'FOO_🦄': '42', BAZ_FOO: 'bar'}

envDotProp.delete('foo');
envDotProp.get('');
//=> {baz: {foo: 'bar'}}

console.log(process.env);
//=> {BAZ_FOO: 'bar'}

Điều này giúp bạn phân tích các biến môi trường và sử dụng chúng làm đối tượng cấu hình trong ứng dụng của bạn.
Nó cũng giúp bạn thực hiện cấu hình 12 yếu tố .


2

Một cách rất tốt để thực hiện các biến môi trường mà tôi đã sử dụng thành công là dưới đây:

A. Có các tệp cấu hình khác nhau :

  1. dev.js // cái này có tất cả các biến môi trường chỉ để phát triển
    Tệp chứa:

    module.exports = {
     ENV: 'dev',
     someEnvKey1 : 'some DEV Value1',
     someEnvKey2 : 'some DEV Value2'
    };
  2. stage.js // cái này chỉ có tất cả các biến môi trường để phát triển

    ..
  3. qa.js // cái này có tất cả các biến môi trường để chỉ kiểm tra qa
    Tệp chứa:

    module.exports = {
     ENV: 'dev',
     someEnvKey1 : 'some QA Value1',
     someEnvKey2 : 'some QA Value2'
    };

LƯU Ý : hầu hết các giá trị đang thay đổi theo môi trường, nhưng các khóa vẫn giữ nguyên.

  1. bạn có thể có nhiều hơn

  2. z__prod.js // cái này có tất cả các biến môi trường chỉ để sản xuất / sống
    LƯU Ý: Tệp này không bao giờ được đóng gói để triển khai

  3. Đặt tất cả các tệp cấu hình này trong / config / thư mục

    <projectRoot>/config/dev.js
    <projectRoot>/config/qa.js
    <projectRoot>/config/z__prod.js
    <projectRoot>/setenv.js
    <projectRoot>/setenv.bat
    <projectRoot>/setenv.sh

LƯU Ý : Tên của prod khác với những cái khác, vì nó sẽ không được sử dụng bởi tất cả.

B. Đặt các biến môi trường OS / Lambda / AzureFunction / GoogleCloudFunction từ tệp cấu hình

Bây giờ lý tưởng, các biến cấu hình này trong tệp, nên đi dưới dạng các biến môi trường hệ điều hành (hoặc, các biến chức năng LAMBDA hoặc, các biến chức năng Azure, Google Cloud Function, v.v.)

vì vậy, chúng tôi viết tự động hóa trong hệ điều hành Windows (hoặc khác)

  1. Giả sử chúng ta viết tập tin bat ' setenv ', lấy một đối số là môi trường mà chúng ta muốn đặt

  2. Bây giờ hãy chạy " setenv dev "

a) Cái này lấy đầu vào từ biến đối số được truyền ('dev' bây giờ)
b) đọc tệp tương ứng ('config \ dev.js')
c) đặt các biến môi trường trong HĐH Windows (hoặc loại khác)

Ví dụ,

Nội dung setenv.bat có thể là:

    node setenv.js

Nội dung setenv.js có thể là:

    // import "process.env.ENV".js file (dev.js example)
    // loop the imported file contents
    //     set the environment variables in Windows OS (or, Lambda, etc.)

Đó là tất cả , môi trường của bạn đã sẵn sàng để sử dụng.

Khi bạn thực hiện ' setenv qa ', tất cả các biến môi trường qa sẽ sẵn sàng để sử dụng từ qa.js và sẵn sàng để sử dụng bởi cùng một chương trình (luôn yêu cầu process.env.someEnvKey1, nhưng giá trị mà nó nhận được là qa một).

Mong rằng sẽ giúp.


1

Làm cho cuộc sống của bạn dễ dàng hơn với dotenv-webpack . Chỉ cần cài đặt nó npm install dotenv-webpack --save-dev, sau đó tạo một .envtệp trong thư mục gốc của ứng dụng của bạn (hãy nhớ thêm tệp này vào .gitignoretrước bạn git push). Mở tệp này và đặt một số biến môi trường ở đó, ví dụ như:

ENV_VAR_1=1234
ENV_VAR_2=abcd
ENV_VAR_3=1234abcd

Bây giờ, trong cấu hình webpack của bạn thêm:

const Dotenv = require('dotenv-webpack');
const webpackConfig = {
  node: { global: true, fs: 'empty' }, // Fix: "Uncaught ReferenceError: global is not defined", and "Can't resolve 'fs'".
  output: {
    libraryTarget: 'umd' // Fix: "Uncaught ReferenceError: exports is not defined".
  },
  plugins: [new Dotenv()]
};
module.exports = webpackConfig; // Export all custom Webpack configs.

Chỉ const Dotenv = require('dotenv-webpack');, plugins: [new Dotenv()]và tất nhiên module.exports = webpackConfig; // Export all custom Webpack configs.là bắt buộc. Tuy nhiên, trong một số trường hợp, bạn có thể gặp một số lỗi. Đối với những điều này, bạn có giải pháp cũng ngụ ý làm thế nào bạn có thể sửa một số lỗi nhất định.

Bây giờ, bất cứ nơi nào bạn muốn, bạn có thể dễ dàng sử dụng process.env.ENV_VAR_1, process.env.ENV_VAR_2, process.env.ENV_VAR_3trong ứng dụng của bạn.


0

Tôi đã nhận được không xác định sau khi thiết lập một hệ thống env var. Khi tôi đặt APP_VERSION trong var người dùng env, sau đó tôi có thể hiển thị giá trị từ nút thông qua process.env.APP_VERSION


-1

Nếu bạn đang sử dụng mac / linux và bạn muốn truy xuất các tham số cục bộ cho máy bạn đang sử dụng, đây là những gì bạn sẽ làm:

  1. Trong thiết bị đầu cuối chạy nano ~ / .bash_profile
  2. thêm một dòng như: export MY_VAR = var
  3. lưu và chạy nguồn ~ / .bash_profile
  4. trong nút sử dụng như: console.log ( process.env.MY_VAR );
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.