NODE_ENVとは何ですか、それをExpressでどのように使用しますか?


184

これは私のアプリです。現在、本番環境で実行しています。

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());
});

しかし、知っNODE_ENVて使いたいと思いました。これどうやってするの?


あなたの場合、私はあなたが使用できるものがapp.configure('development', ...)「開発」または「本番」であると想定して、開発または本番環境のみに特定の設定を設定します。expressjs.com/api.html#app.configure
Andreas Hultgren

回答:


360

NODE_ENVは、高速 Webサーバーフレームワークによって一般的になった環境変数です。ノードアプリケーションを実行すると、環境変数の値を確認し、その値に基づいてさまざまな処理を実行できます。具体的には、(慣例により)特定の環境が本番環境か開発環境かを示すために使用されます。一般的な使用例は、開発環境で実行している場合に、追加のデバッグまたはロギングコードを実行することです。NODE_ENV

NODE_ENVへのアクセス

次のコードを使用して自分で環境変数にアクセスし、独自のチェックとロジックを実行できます。

var environment = process.env.NODE_ENV

または、代わりにExpressを使用するapp.get('env')注:これはデフォルトで"development"

NODE_ENV環境を明示的に設定していない場合は、になることに注意してくださいundefined

NODE_ENVの設定

実際に環境変数を設定する方法は、オペレーティングシステムによって異なり、ユーザーの設定にも依存します。

環境変数を1回限りとして設定する場合は、コマンドラインから設定できます。

  • LinuxおよびMacexport NODE_ENV=production
  • $env:NODE_ENV = 'production'

長期的には、これを永続化して、再起動しても設定が解除されないようにする必要があります。これを行うための可能な方法をすべて列挙するのではなく、自分で行う方法を検索してみましょう!

慣例NODE_ENVにより、productionまたはのいずれかに使用する必要がある値developmentはすべて小文字であると規定されています。値の追加を止めるものは何もありませんが、私が使用する多くのnode_modulesにこの種のコードがたくさんあるので、それはおそらく良いアイデアではありません。

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

それはだと注意本当に悪い設定しようとする発想NODE_ENVから内部ノード・アプリケーション自体、あなたがしなければ、それはなります- だけそれが設定されたプロセスに適用されます物事は、おそらくあなたのようではない仕事はそれらを期待してますので、。それをしないでください-あなたはそれを後悔します。


5
Express 4ではapp.configure()削除されました。エクスプレス4移行ガイドをすることをお勧めします「の使用process.env.NODE_ENVapp.get('env')環境を検出し、それに応じてアプリケーションを構成するために。」
Chris Bartley

3
app.get( 'env')を使用するのが最善だと思います。環境が未定義の場合、デフォルトではdevになり、変数を確認するだけで未定義になります
light24bulbs

11
良い点-デフォルトを強調するためにメモを追加しました。しかし、私の個人的な感情は、あなたがapp.get('env')その理由で正確に使用すべきではないということです。この重要な変数が設定されていないことを覆い隠します-expressの外部からアクセスすると、一貫性がないように見えます。さらに、開発環境でデバッグコードを誤って実行ないほうが、実稼働環境で誤って実行するよりも害が少ないと思います。
Ed Hinchliffe 2014年

5
高速アプリケーションでNODE_ENVの設定を省略した場合の影響を測定しました。デフォルトでは、development特に、リクエストごとにテンプレートが再処理されることになります。その結果、Jadeを使用すると、本番環境と開発環境の間でパフォーマンスが最大75%向上します。そのapmblog.dynatrace.com/2015/07/22/に
DanielKhan

8
エクスプレスプロジェクトの場合、「プロダクション」と「開発」の他に、自動テストを実行するには少なくとももう1つの「テスト」が必要だと思います。入力されたテストデータに別のDBを使用することもできます。
dawnstar 2016年

19

NODE_ENVは、ノード環境を表す環境変数です。高速サーバーの。

私たちがどの環境にいるのかを設定して検出する方法です。

それは非常に一般的な使用productiondevelopment

セットする:

export NODE_ENV=production

取得する:

あなたはそれを使ってそれを得ることができます app.get('env')


11

元の質問にはExpressがこの環境変数をどのように使用するかが含まれていると思います。

Expressは、NODE_ENVを使用して、独自のデフォルトの動作を変更します。たとえば、開発モードでは、デフォルトのエラーハンドラがスタックトレースをブラウザに送り返します。プロダクションモードでは、Internal Server Error実装の詳細が世界に漏れるのを防ぐために、応答は単純です。


0

通常、NODE_ENVコードを開発、テスト、デバッグするときに、変数を使用して特別なアクションを実行します。たとえば、本番環境では不要な詳細なログとデバッグ出力を生成するために。Express自体の動作NODE_ENVは、がに設定されているかどうかによって異なりproductionます。これらの行をExpressアプリに配置し、次に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!")
})

後者app.use()は、他のすべてのメソッドハンドラの後に、最後でなければならないことに注意してください。

サーバーを起動NODE_ENVするproduction前にに設定してからサーバーにGET /errorリクエストを送信するForcing an error!と、コンソールにテキストが表示されず、応答にHTML本体(Expressから発生)にスタックトレースが含まれていてはなりません。代わりに、NODE_ENVサーバーを起動する前に別のものにすると、逆のことが起こります。

Linuxでは、環境変数NODE_ENVを次のように設定します。

NODE_ENV = ' 'をエクスポート

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.