Node.jsで開発環境を切り替え

f:id:daihase:20190809120056p:plain

こんばんわ、daihaseです。

段々寒い季節になってきましたね。自分もまさかの若干風邪気味です...。 気を取り直し、今日はNode.jsを使った開発に関する内容を。

Node.jsのプロジェクトでは起動時に、どの環境設定を元に立ち上げるかを指定することが出来ます。

どういうことか、例えばWebアプリケーション開発において一般公開するものはProduction(本番環境)、日々修正したり改修を加えるものをDevelopment(開発環境)といったように通常わけて開発をします。開発しているプロジェクトのソースなどは1種類ですが、データベースの参照先やAPIのURL、他様々なパスなど、開発・本番によって基本的に切り分けて開発を行います。

Node.jsには環境変数というものがあり、それを設定することで簡単に環境を切り替えることが出来ます。Node.jsで開発する際にpm2という便利なデーモン化するツールがあり、今回はそれを使って説明します。

pm2の紹介は過去記事を参考にしてみてください。

 

環境ごとの設定ファイルを用意

基本的にExpressを使ったNode.jsのアプリを起動する場合、「node app.js」と入力しますが、ここでは設定ファイルから起動するための準備をまず行います。

プロジェクトのルートフォルダに好きなファイル名でOKなので、適当にjsonファイルを作成します。

自分は「configuration.json」としています。中身は以下のように、環境変数NODE_ENVごとにそれぞれ「development」「staging」「production」と定義されているのがわかりますね。

{
  "name" : "board",
  "script" : "./bin/www",
  "env": {
    "NODE_ENV" : "development"
  },
  "env_staging": {
    "NODE_ENV" : "staging"
  },
  "env_production": {
    "NODE_ENV" : "production"
  }
}

 

設定ファイルを作成したとこで、ちょっと便利なnpmを紹介。 node-configというもので、こちらを以下コマンドでプロジェクト内にインストール。

npm install config --save

Expressプロジェクトのトップにconfigフォルダを作成します。公式にもdefault.jsonを作成するようにありますが、こちらは何も指定しない場合に自動に読み込む設定ファイルで、自分で必要な環境分のjsonファイルを作成します。「development.json」「staging.json」「production.json」などと用意してやればいいでしょう。

中身はこんなイメージ。

{
  "server": {
    "port": 3000
  },

  "db": {
    "host": "xxx.co.jp",
    "user": "root",
    "password": "pass",
    "database": "db",
    "timezone": "utc",
    "dateStrings": "date"
  }
}

 

こうして環境ごとのjsonファイルを用意しておけば、後のpm2にてオプション付きで起動することでdefault.jsonへその内容を上書き、それぞれのjsonファイルに記載した内容を読み込み実行する形になります。

pm2でオプションを指定し起動

上の方で通常「node app.js」と叩きアプリを起動するといいましたが、pm2を使った場合は以下のようにオプションを指定し、読み込むjsonファイルを指定し起動します。

pm2 start configuration.json --env development

 

これで、devemopment.json内に書かれた内容を元にアプリを起動します。jsonにはそれぞれ開発・本番ごとにデータベースやAPI URLの向き先が指定されているので、これで環境ごとに簡単に起動モードを切り分けることが出来るのです。

ちなみにnode-configは「const config = require('config');」とするだけでそれぞれのjsonの中身を取得出来るので、

const config = require('config');
const db = config.get('db');

としてやるだけで、先ほどの環境設定ファイルであるjson(development.jsonなど)の中身を取得出来るため、ソース上で開発環境か本番環境かなどの分岐等、全く意識することなく処理を書けます。

サーバーサイドの開発は、どうしても開発、本番とサーバーをわけて開発することが多いので、こういった環境の切り替えは簡単に出来ると色々捗りますよね。

今日はここまで、それでは良い開発ライフを〜