process.env.NODE_ENVは未定義です


168

NodeJのチュートリアルを実行しようとしています。私は何かを逃したとは思わないが、process.env.NODE_ENV私が返す唯一の値を呼び出すときはいつでも未定義である。私の研究によると、デフォルト値は「開発」でなければなりません。この値はどのように動的に設定され、どこで最初に設定されますか?


使用できるherokuアプリにNODE_ENVを設定するには:heroku config:set NODE_ENV="production"
Connor Leech

14
以下の答えは環境変数を設定することで一時的に問題を解決しますが、ここでの大きな教訓は、環境変数が設定されるかどうかわからないということです...したがって、それに応じてコードを記述し、設定されているかどうかをテストします。何に。それについて仮定しないでください。
Stijn de Witt

回答:


193

process.envは環境への参照であるため、そこで変数を設定する必要があります。

Windowsで環境変数を設定するには:

SET NODE_ENV=development

OS XまたはLinuxの場合

export NODE_ENV=development

4
NODE_ENVが設定されていない場合、アプリは「開発」モードのように動作する
Rocco

1
Linuxの場合は、vi〜/ .bash_profileを実行し、NODE_ENV = developmentを挿入して保存します。
stonyau 2014年

6
他の誰かが苦労した場合... "SET V = VAL"と "SET V = VAL"には違いがあります。スペースは重要です。
willem

4
上記と同様に「cross-env」モジュールを実行すると、OSXとWindowsの両方で機能することに注意してください:「cross-env NODE_ENV = development」。最初にクロス環境をインストールする必要があります: "npm install cross-env --save"。package.jsonのスクリプトにそれがあれば、両方のプラットフォームで実行できます。
Antonio Brandao 2016年

6
私のために働いていませんでした。同じターミナルから実行export NODE_ENV=developmentする前に、Macターミナルで実行しましたreact-native run-ios。デバッグ時の値process.env.NODE_ENVは未定義です。
アッシュ

58

チップ

package.json

"scripts": {
  "start": "set NODE_ENV=dev && node app.js"
 }

app.js

console.log(process.env.NODE_ENV) // dev
console.log(process.env.NODE_ENV === 'dev') // false
console.log(process.env.NODE_ENV.length) // 4 (including a space at the end) 

だから、これは良いかもしれません:

"start": "set NODE_ENV=dev&& node app.js"

または

console.log(process.env.NODE_ENV.trim() === 'dev') // true

2
あなたができることはこれなので、トリミングする必要はありません:"start": "set NODE_ENV=dev&& node app.js"
Z. Khullah

すばらしい観察、console.log(process.env.NODE_ENV.length) // 4(最後のスペースを含む)
gregn3

1
これはconsole.log(('' + process.env.NODE_ENV).trim() === 'dev') // trueprocess.env.NODE_ENVが定義されていなくもエラーをスローしないため、より安全です。
gregn3

52

* nix(Linux、OS Xなど)を使用している場合は、2番目のエクスポートコマンドを使用する必要はありません。呼び出しコマンドの一部としてチェーンできます。

NODE_ENV=development node server.js

簡単ですか?:)


3
cross-envのようなパッケージを使用すると、Windowsでも機能します。
walkerrandophsmith 2016

35

Windowsでノードを操作しているときにこの問題に遭遇しました。

アプリを実行しようとする人にこれらの変数を設定するように要求するのではなく、アプリケーション内にフォールバックを提供しました。

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

本番環境では、通常の方法(SET / export)に従って定義します。


3
これが最も実用的なソリューションです。
druskacik

12

cross-env npmパッケージを使用できます。環境変数のトリミングを処理し、異なるプラットフォーム間で動作することも確認します。

プロジェクトのルートで、次を実行します。

npm install cross-env

次に、package.jsonのスクリプトの下に、以下を追加します。

"start": "cross-env NODE_ENV=dev node your-app-name.js"

次に、ターミナルのプロジェクトルートで、次のコマンドを実行してアプリを起動します。

npm start

その後、環境変数はとしてアプリで使用できるようprocess.env.NODE_ENVになるため、次のようなことができます。

if (process.env.NODE_ENV === 'dev') {
  // Your dev-only logic goes here
}

私はこれがうまくいくとは思いません。現在のプロジェクトで試してみましたが、NODE_ENVはまだ定義されていません。動作するようにするには、もう少し設定が必要になる場合があります。
Aakash Thakur

1
この答えを見つけるために約2時間検索しました。ありがとうございます。
Bob

npm install --save-dev cross-env
DalSoft

9

package.jsonで、以下のように構成する必要があります(LinuxおよびMac OSで動作)

重要なことは、以下のビルドコマンドが例である後の「export NODE_ENV = production」です。

  "scripts": {
     "start": "export NODE_ENV=production && npm run build && npm run start-server",
     "dev": "export NODE_ENV=dev && npm run build && npm run start-server",
  } 
  • 開発環境では、「npm run dev」コマンドを実行する必要があります

  • 本番環境では、「npm run start」コマンドを実行する必要があります


9

ではMacOSの Expressバージョンを使用している人のために4.x.xと使用してDOTENVプラグインを、次のように使用する必要があります。

  1. プラグインをインストールした後、アプリケーションを初期化するファイルに次のようにインポートします。 require('dotenv').config({path: path.resolve(__dirname+'/.env')});

  2. ルートディレクトリにファイル「.env」を作成し、次のように変数を追加します。

    NODE_ENV=development または NODE_ENV = development



1

OSによる

package.jsonに、必ずスクリプトがあることを確認してください(app.jsは実行するメインのjsファイルであり、NODE_ENVは.envファイルで宣言されています)。例:

"scripts": {
    "start": "node app.js",
    "dev": "nodemon server.js",
    "prod": "NODE_ENV=production & nodemon app.js"
  }

窓用

また、NODE_ENV = developmentを持つ.envファイル変数を設定します

.envファイルがeg.configフォルダーのフォルダーにある場合は、必ずapp.js(メインのjsファイル)で指定してください

const dotenv = require( 'dotenv'); dotenv.config({パス: './config/config.env'});


0

Reactでこの問題に直面した場合は、react-scripts @ 0.2.3以降が必要です。またNODE_ENV、Reactで機能する以外の環境変数の場合は、プレフィックスとしてを付ける必要がありますREACT_APP_



-3

たとえば、コードで設定することもできます。

process.env.NODE_ENV = 'test';


67
私は、アプリケーションロジックで環境識別子を変更しないように強くお勧めします。アプリケーションに、それが実際とは違うものであると突然考えて欲しくない場合。他の多くの回答が示唆しているように、これはシステムレベルでのみ変更する必要があります。
Kafoso 2015

7
12ファクターアプリについては、12factor.net / configをご覧ください。このコードはその違反になります。構成をコードから分離しておくことには十分な理由があります。
jcollum 2017

1
自動テストにのみ役立つ場合がありますが、それでも、envから直接読み取るのではなく、抽象化してメインコードに挿入することができます。
Angelos Pikoulas

@Kafosoによる有益なコメントが減るほどこの回答に反対票を投じないでください。または、この情報をよく投票された回答に追加します。
Vibhor Dube
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.