검색 할 노드의 환경 변수 설정


414

튜토리얼을 따르려고하는데 다음과 같이 말합니다.

자격 증명을로드하는 몇 가지 방법이 있습니다.

  1. 환경 변수에서로드
  2. 디스크의 JSON 파일에서로드

키는 다음과 같아야합니다.

USER_ID, USER_KEY

... 즉, 환경 변수를 올바르게 설정하면 응용 프로그램에서 자격 증명을 전혀 관리 할 필요가 없습니다.

일부 인터넷 검색을 기반으로 process.env? 에서 변수를 설정 해야하는 것으로 보입니다 . 이 자격 증명을 어떻게 그리고 어디에 설정합니까? 예를 들어주세요.

답변:


397

환경 변수 (이 경우)는 자격 증명을 응용 프로그램에 전달하는 데 사용됩니다. USER_ID그리고 USER_KEY모두에서 액세스 할 수 process.env.USER_IDprocess.env.USER_KEY각각. 편집 할 필요가 없으며 컨텐츠에 액세스하면됩니다.

그들은 단순히로드 사이에 당신에게 선택권을주는 것 같습니다 USER_IDUSER_KEY중 하나에서 process.env디스크의 일부를, 지정된 파일이나.

이제 마술은 응용 프로그램을 실행할 때 발생합니다.

USER_ID=239482 USER_KEY=foobar node app.js

사용자 ID 239482와 사용자 키를로 전달합니다 foobar. 테스트에는 적합하지만 프로덕션 환경에서는 변수를 내보내도록 일부 bash 스크립트를 구성하고있을 것입니다.


26
당신이 사용하는 경우 fish대신 bash, 당신은 사용이 필요합니다 env USER_ID=239482 my_command. 예를 들어, Node.js를 '에 대한 환경 변수를 설정하기위한 debug라이브러리 : env DEBUG='*' node some_file.js fishshell.com/docs/current/faq.html#faq-single-env
SilentSteel

1
나는 그것이 작동하기 위해 "*"주위의 따옴표를 제거해야한다는 것을 발견했다 :env DEBUG=* node some_file.js
divillysausages

@ Samam 우분투 리눅스에서 이러한 변수를 어떻게 설정합니까?
Mohammed Zameer 2018 년

1
많은 env 스크립트를 추가하는 대신 파일을 추가 할 수 있습니까? 아니면 유닉스 사용자가 bash 스크립트를 작성해야합니까?
mibbit

@mibbit 그렇습니다 . 파일 dotenv을 읽고 .env적용 할 것이기 때문입니다.
balexandre 2019

200

dotenv 패키지를 살펴 보는 것이 좋습니다.

https://github.com/motdotla/dotenv

@ Benxamin의 답변에서 제안 된 라이브러리와 비슷하지만 훨씬 깨끗하고 bash 스크립트가 필요하지 않습니다. 또한 코드 기반이 널리 사용되고 유지 관리된다는 점에 주목할 가치가 있습니다.

기본적으로 .env 파일이 필요합니다 (git / mercurial / etc에서 무시하는 것이 좋습니다).

FOO=bar
BAZ=bob

그런 다음 응용 프로그램 항목 파일에 가능한 빨리 다음 줄을 입력하십시오.

require('dotenv').config();

팔. 끝난. 'process.env'는 이제 위 변수를 포함합니다 :

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

'.env'파일은 필요하지 않으므로 앱이 없을 때 앱이 넘어 질까 걱정할 필요가 없습니다.


1
앱에 필요한 관련 구성 세부 정보 (예 :이 질문이 문의하는 내용)를 넣으면 부재시 넘어 질 가능성이 있지만 여전히 좋은 옵션 인 것 같습니다.
John

6
추가 안전을 찾고 있다면 github.com/rolodato/dotenv-safe 를 사용하면 몇 가지 테스트를 수행해야합니다.
ctrlplusb

1
응용 프로그램에서 필요하지 않은 경우 : github.com/direnv/direnv
AlecRust

100

명령 줄에 env 값을 제공하십시오.

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

2
bash 쉘 (cygwin; 내가 생각하는 git 도구와 함께 설치됨)이있는 Windows에서 나를 위해 일했다고 덧붙였다.
markau

@TiborSzasz : Cygwin 또는 Powershell이 ​​해결해야합니다. 이것은 물론 2 년 후에 언급됩니다.
orlando marinella

9
윈도우 사용을 위해 : SET USER_ID는 = 'ABC'
마이크

@ 마이크, 당신은 그 정답을해야합니다 :)
rocketspacer

6
cross-env 패키지 ( npmjs.com/package/cross-env )를 사용하여 유닉스 또는 windwos에서 작동하도록 할 수 있습니다
Brij

79

다음과 같이 프로세스 글로벌 변수를 통해 환경 변수를 설정할 수 있습니다.

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

모든 플랫폼에서 작동합니다.


22
... 환경 변수는 코드 외부가 아닌 코드 외부에서 설정되도록되어 있습니다. 따라서 이것은 목적과 나쁜 예를 넘어서는 것입니다
Soren

44
출시 자식 프로세스가이 대답 혜택을 우리의 노드 프로그램 @Soren, 그래서 조금 정통 비록 이것에 대한 사용 사례가있다
pspi

2
@pspi - 나는 99 % 확신 당신이 그것을 잘못하고있다 그리고 당신은의 저자 않는 한 설정 패키지 처럼 대신 같은 설정 패키지를 사용한다.
Soren

17
이것은 js로 빌드 스크립트를 작성하고 npm에서 실행하는 경우에 유용합니다.
Stephen Drew

28
또한 테스트 실행시 환경 설정 및 재정의에 유용합니다.
mtkopone

54

관리 옵션을 원하면 envs npm 패키지를 사용해보십시오 . 설정된 경우 환경 값을 반환합니다. 그렇지 않으면, 환경에 있지 않은 경우 전역 기본값 오브젝트 변수에 저장되는 기본값을 지정할 수 있습니다.

사용 .env의를 파일 ( "점 EE-KO-V 시리즈를") 또는 환경은 여러 가지 이유로 좋다. 개인은 자신의 구성을 관리 할 수 ​​있습니다. 고유 한 환경 설정을 사용하여 다양한 환경 (dev, stage, prod)을 클라우드 서비스에 배포 할 수 있습니다. 합리적인 기본값을 설정할 수 있습니다.

.env파일 안에 각 줄은 다음 예제와 같은 항목입니다.

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

버전 관리 저장소에 파일 을 포함 시키지 않아야 .env합니다 ( .gitignore파일에 추가 ).

에서 변수를 가져 오려면 .env파일 환경으로 bash 스크립트를 사용 export NODE_ENV=development하여 응용 프로그램을 시작하기 직전에 동등한 작업을 수행 할 수 있습니다 .

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

그런 다음 응용 프로그램 자바 스크립트에갑니다.

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
흠,이 패키지를 사용하려고했지만 환경 변수 사용 만 추적하는 것 같습니다. .env 파일 ( npmjs.com/package/envs )을 읽지 않습니다 . 올바른 패키지입니까?
wawka

1
네가 옳아! .env 파일을 읽지 않습니다. 이건 창피해. @SamT가 언급 한 것처럼 bash 스크립트로 .env를로드하는 것을 잊었으므로 어쨌든 효과가있었습니다.
Benxamin

1
"필요 ( 'envs')"? "envs"란 무엇입니까?
CodyBugstein 1

1
'envs'는 노드 모듈의 이름입니다. npmjs.com/package/envs
Benxamin

4
또한 "dotenv"모듈을 사용하는 것이 좋습니다. 모든 ENV 변수를 proccess 객체에 넣습니다.
Bruno de Oliveira

37

운영 체제와 쉘에 따라 다릅니다.

쉘 bash는 리눅스 , 당신은 (콘솔에서)이 같은 환경 변수를 만들 :

export FOO=bar

우분투 환경 변수에 대한 자세한 정보 (예 :)

우분투 환경 변수


1
그런 다음이 답변을 참조하십시오 : stackoverflow.com/questions/135688/…
leszek.hanusz

2
그리고 Windows는 어떻습니까? 여기에 추가해 주시겠습니까?
YakovL

아, 신경
쓰지 마라

Linux bash에서 이러한 값이 유지됩니까? 나중에 다른 응용 프로그램에 문제가 발생하지 않도록 터미널이 열린 상태에서만 실행하려면 어떻게해야합니까?
JesseBoyd

13

ctrlplusb가 말했듯이 package을 사용하는 것이 좋지만 dotenv이것을 수행하는 또 다른 방법은 js 파일을 만들고 앱 서버의 첫 번째 줄에 파일을 요구하는 것입니다.

env.js :

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

app.js :

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

9

Windows 사용자 :주의하십시오! 이 명령은 Unix에 권장되지만 Windows에서는 임시입니다. 컴퓨터를 다시 시작하거나 새 터미널 쉘을 시작하자마자 현재 쉘에 대해서만 변수를 설정합니다.

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

Windows에서 지속적 환경 변수를 설정하려면 대신 다음 방법 중 하나를 사용해야합니다.

A) 프로젝트의 .env 파일 -코드를 실행하기 전에 환경 변수를 설정하지 않고도 프로젝트를 다른 시스템으로 옮길 수 있기 때문에 이것이 가장 좋은 방법입니다.

  1. .env컨텐츠를 사용하여 프로젝트 폴더 루트에 파일을 작성하십시오 .TEST="hello world"

  2. 해당 파일을 읽을 노드 코드를 작성하십시오. dotenv ( npm install dotenv --save)를 설치 한 다음 require('dotenv').config();노드 설정 코드 중에 추가 하는 것이 좋습니다 .

  3. 이제 노드 코드에 액세스 할 수 있습니다process.env.TEST

환경 파일은 코드 기반에 원하지 않는 API 키 및 기타 비밀을 유지하는 데 좋습니다. 에 추가하십시오 .gitignore.

B) Powershell 사용 -다른 터미널에서 액세스 할 수있는 변수를 만듭니다. 그러나 컴퓨터를 다시 시작하면 변수가 손실됩니다.

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

이 방법은 Windows 포럼에서 널리 권장되지만 사람들이 시스템을 다시 시작한 후에도 변수가 지속되지 않는다는 것을 알고 있다고 생각하지 않습니다.

C) Windows GUI 사용

  1. 시작 메뉴 검색 또는 제어판에서 "환경 변수"를 검색하십시오.
  2. "시스템 환경 변수 편집"을 선택하십시오.
  3. 대화가 열립니다. 대화창 하단의 "환경 변수"버튼을 클릭하십시오.
  4. 이제 변수를 편집 할 수있는 작은 창이 있습니다. "신규"버튼을 클릭하여 새로운 환경 변수를 추가하십시오. 쉬운.

8

1 단계 : 환경 변수를 해당 파일에 추가하십시오. 예를 들어, 준비 환경 호출 할 수있는 .env.staging환경 변수를 포함하는, USER_IDUSER_KEY준비 환경에 특정합니다.

2 단계 : 당신의에서 package.json파일, 다음을 추가합니다 :

"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",
  ...
}

그런 다음 배포 스크립트에서 다음과 같이 호출하십시오.

npm run build:staging

매우 간단한 설정과 매력처럼 작동합니다!

출처 : https://medium.com/@tacomanator/environments-with-create-react-app-7b645312c09d


2
@JohnXiao 어때요?
Blairg23


4

이를위한 멋진 도구를 발견했습니다.

노드 환경 파일

환경 파일 (ENV 변수 내보내기 포함)을 Node.js 환경으로 구문 분석하고로드합니다. 즉, process.env이 스타일을 사용합니다.

.env

# some env variables

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

2

@ctrlplusb 답변의 확장으로 패키지를
살펴 보는 것이 좋습니다 env-dot-prop.

process.env사용하여 속성을 설정하거나 가져올 수 있습니다 dot-path.

process.env다음이 포함되어 있다고 가정 해 봅시다 .

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

그런 다음 다음과 같은 환경 변수를 조작 할 수 있습니다.

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'}

이를 통해 환경 변수를 구문 분석하여 앱에서 구성 객체로 사용할 수 있습니다.
또한 12 단계 구성 을 구현하는 데 도움이됩니다 .


2

내가 성공적으로 사용한 환경 변수를 수행하는 매우 좋은 방법은 다음과 같습니다.

A. 다른 설정 파일이 있습니다 :

  1. dev.js // 개발 용 환경 변수 만 있습니다
    . 파일에는 다음이 포함됩니다.

    module.exports = {
     ENV: 'dev',
     someEnvKey1 : 'some DEV Value1',
     someEnvKey2 : 'some DEV Value2'
    };
  2. stage.js // 개발을위한 모든 환경 변수가 있습니다

    ..
  3. qa.js // 여기에는 qa 테스트 전용
    의 모든 환경 변수가 있습니다. 파일에는 다음이 포함됩니다.

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

참고 : 값은 환경에 따라 변경되지만 키는 동일하게 유지됩니다.

  1. 당신은 더 가질 수 있습니다

  2. z__prod.js // 프로덕션 / 라이브 전용 환경 변수가 모두 있습니다
    . 참고 :이 파일은 배포 용으로 번들로 제공되지 않습니다

  3. 이 모든 구성 파일을 / config / 폴더에 넣습니다.

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

참고 : prod의 이름은 다른 이름과 다릅니다. 모두 사용하지는 않습니다.

B. 구성 파일에서 OS / Lamda / AzureFunction / GoogleCloudFunction 환경 변수 설정

이상적으로는 파일의 이러한 구성 변수는 OS 환경 변수 (또는 LAMBDA 함수 변수 또는 Azure 함수 변수, Google Cloud Functions 등)로 이동해야합니다.

그래서 우리는 Windows OS (또는 기타)에서 자동화를 작성합니다

  1. ' setenv'bat 파일 을 작성한다고 가정하십시오. 설정하려는 환경 인 인수가 하나 있습니다.

  2. 이제 " setenv dev "를 실행하십시오.

a) 전달 된 인수 변수 (현재는 'dev')에서 입력을받습니다.
b) 해당 파일을 읽습니다 ( 'config \ dev.js').
c) Windows OS (또는 기타)에서 환경 변수를 설정합니다.

예를 들어

setenv.bat 내용은 다음과 같습니다.

    node setenv.js

setenv.js 내용은 다음과 같습니다.

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

그게 다야 , 당신의 환경은 사용할 준비가되었습니다.

' setenv qa ' 를 수행하면 모든 qa 환경 변수가 qa.js에서 사용할 수 있으며 동일한 프로그램에서 사용할 수 있습니다 (항상 process.env.someEnvKey1을 요청하지만 얻는 값은 qa 1 임).

희망이 도움이됩니다.


1

dotenv-webpack으로 인생을 더 편하게 만드십시오 . 간단히 설치 npm install dotenv-webpack --save-dev한 다음 .env응용 프로그램의 루트에 파일 을 만듭니다 (이전에 파일을 추가 .gitignore해야합니다 git push). 이 파일을 열고 다음과 같은 환경 변수를 설정하십시오.

ENV_VAR_1=1234
ENV_VAR_2=abcd
ENV_VAR_3=1234abcd

이제 웹팩 설정에서 다음을 추가하십시오.

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.

const Dotenv = require('dotenv-webpack');, plugins: [new Dotenv()]그리고 물론 module.exports = webpackConfig; // Export all custom Webpack configs.필요합니다. 그러나 일부 시나리오에서는 약간의 오류가 발생할 수 있습니다. 이를 위해 특정 오류를 수정하는 방법을 암시하는 솔루션이 있습니다.

자, 어디든지 당신은 당신이 간단하게 사용할 수 있습니다 싶어 process.env.ENV_VAR_1, process.env.ENV_VAR_2, process.env.ENV_VAR_3응용 프로그램에서.


0

시스템 환경 변수를 설정 한 후 정의되지 않았습니다. APP_VERSION을 User env var에 넣으면 process.env.APP_VERSION을 통해 노드의 값을 표시 할 수 있습니다


-1

mac / linux를 사용하고 있고 사용중인 시스템에 대한 로컬 매개 변수를 검색하려면 다음과 같이하십시오.

  1. 터미널에서 nano ~ / .bash_profile을 실행하십시오.
  2. 다음과 같은 행을 추가하십시오. export MY_VAR = var
  3. 소스 저장 및 실행 ~ / .bash_profile
  4. 노드에서 다음과 같이 사용하십시오. console.log ( process.env.MY_VAR );
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.