取得するノードの環境変数の設定


414

私はチュートリアルを実行しようとしています、それは言う:

資格情報をロードするにはいくつかの方法があります。

  1. 環境変数から読み込まれ、
  2. ディスク上のJSONファイルから読み込まれ、

キーは次のようにする必要があります。

USER_ID, USER_KEY

...つまり、環境変数を適切に設定すれば、アプリケーションで認証情報を管理する必要がまったくなくなります。

いくつかのグーグルに基づいて、変数を設定する必要があるようprocess.envです?これらの資格情報をどこでどのように設定しますか?例をご覧ください。

回答:


397

環境変数(この場合)は、資格情報をアプリケーションに渡すために使用されています。USER_IDそして、USER_KEYの両方からアクセス可能process.env.USER_IDprocess.env.USER_KEYそれぞれ。それらを編集する必要はありません。コンテンツにアクセスするだけです。

彼らは単にあなたのロードとの間の選択与えているように見えますUSER_IDし、USER_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

@SamT Ubuntu Linuxでこれらの変数をどのように設定しますか?
Mohammed Zameer 2017年

1
多数のenvスクリプトを追加するのではなく、ファイルを追加することは可能ですか、またはUNIXユーザーはbashスクリプトを作成する必要がありますか?
mibbit 2017

@mibbitはい、それdotenvがすべて.envです。ファイルを読み取って適用します。
balexandre

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 2016年

1
アプリケーションでそれを必要としないようにしたい場合:github.com/direnv/direnv
AlecRust

100

コマンドラインで環境値を指定するだけです

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

2
Windowsでbashシェル(cygwin; gitツールでインストールすると思います)で動作することを追加しただけです。
markau 2016年

@TiborSzasz:CygwinまたはPowershellで修正する必要があります。もちろんこれは2年後に言及されます。
オーランドマリネラ2016年

9
Windowsの場合:SET USER_ID = 'abc'
Mike

@マイク、あなたはそれを正しい答えにする必要があります:)
ロケットスペーサー2016年

6
cross-envパッケージ(npmjs.com/package/cross-env)を使用して、unixまたは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-EN-VEE」)、または環境ファイルは、多くの理由のために良いです。個人は自分の設定を管理できます。独自の環境設定を使用して、さまざまな環境(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

次に、これはあなたのアプリケーションのJavaScriptに行きます:

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が言及したように、.envにbashスクリプトをロードするのを忘れていたので、とにかく動作しました。
Benxamin

1
「require( 'envs')」?「envs」とは何ですか?
CodyBugstein

1
'envs'はノードモジュールの名前です:npmjs.com/package/envs
Benxamin

4
また、「dotenv」モジュールを使用することをお勧めします。これにより、すべてのENV変数がプロセスオブジェクトに入れられます。
ブルーノデオリヴェイラ

37

それはあなたのオペレーティングシステムとあなたのシェルに依存します

上のシェルはbashとLinuxでは、あなたは(コンソールで)このような環境変数を作成します。

export FOO=bar

ubuntuの環境変数の詳細(たとえば):

Ubuntuの環境変数


1
そして、この回答を参照してください。stackoverflow.com/questions/135688/...を
leszek.hanusz

2
そして、Windowsはどうですか?ここに追加していただけませんか?
YakovL 2016年

ああ、用事、それのように見えますが、ここで答えています:stackoverflow.com/questions/9249830/...
YakovL

Linux bashでは、これらの値は保持されますか?ターミナルが開いている間だけ実行して、後で他のアプリケーションで問題が発生しないようにするにはどうすればよいですか?
JesseBoyd

13

ctrlplusbが言ったように、パッケージを使用することをお勧めします 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

Envファイルは、コードベースに含めたくないAPIキーやその他の秘密を保持するのに適しています。必ずに追加してください.gitignore

B)Powershellを使用する -これにより、他の端末からアクセスできる変数が作成されます。ただし、コンピューターを再起動すると、変数が失われることに注意してください。

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

この方法はWindowsフォーラムで広く推奨されていますが、システムの再起動後に変数が保持されないことに人々が気付いていないようです...

C)Windows GUIを使用する

  1. スタートメニューの検索またはコントロールパネルで「環境変数」を検索します
  2. 「システム環境変数の編集」を選択します
  3. ダイアログが開きます。ダイアログの下部にある「環境変数」ボタンをクリックします。
  4. これで、変数を編集するための小さなウィンドウができました。「新規」ボタンをクリックして、新しい環境変数を追加します。簡単です。

8

ステップ1:環境変数を適切なファイルに追加します。たとえば、ステージング環境は、ステージング環境に固有の.env.staging環境変数USER_IDおよびを含むと呼ばUSER_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 / Lambda / AzureFunction / GoogleCloudFunction環境変数を設定する

理想的には、ファイル内のこれらの構成変数は、OS環境変数(またはLAMBDA関数変数、またはAzure関数変数、Google Cloud Functionsなど)として移動する必要があります。

したがって、Windows OS(またはその他)で自動化を記述します

  1. 設定したい環境である1つの引数を取る' setenv 'バットファイルを書き込むと仮定します。

  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

次に、webpack設定に以下を追加します。

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_1process.env.ENV_VAR_2process.env.ENV_VAR_3あなたのアプリケーションに。


0

システム環境変数を設定した後、未定義になりました。APP_VERSIONをユーザー環境変数に配置すると、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.