學習 Node.js 已經兩年之餘,這段時間陸陸續續在開發上遇到一些問題(雷),然而隨著時間累積的叫做經驗,因此藉由此篇文章記錄從本機 development 環境到遠端 Linux 上的 production 所得到的經驗。

Deploy

以下的 localhost 環境皆為 Mac 10.10,express.js, 而 deploy 的環境皆為 Linux 14.04 環境。

1. 環境變數

NODE_ENV 是運行 Node.js 重要的變數,在本機開發的時候預設為 NODE_ENV=development

在執行 app.js (aka bin/www) 時,選擇需要的變數 (development || production),若要運行為 production 環境指令為

$ NODE_ENV=production node bin/www

當然這個 NODE_ENV 值可以直接 export 在你所運行的環境當中,

$ export NODE_ENV=production
$ node bin/www

而若不想每次開啟 shell 都要重新 export 一次,可以將 export 指令寫進 ~/.bashrc 內,之後開啟 shell 就會設定 NODE_ENV=production 了!


Q:那如何在 express.js 框架下的 app.js 拿到環境變數呢? A:只要利用 express 框架為我們做好的 API 如下:

// app.js
app.get('env');

即可得到 NODE_ENV 值。

2. config 檔設定

關於 config 檔的設定,每個人有不同的習慣,我介紹我常用的 config 檔設定方式。

// config.js
var config = {
  development: {
    port: 3000,
    // anything else
  },
  production: {
    port: 3001,
    // anything else
  },
};
module.exports = config;
// app.js
var config = require('./config.js')[app.get('env')];
var port = config.port; // production mode will return 3001

這樣設定 config 檔後,未來就可以利用 NODE_ENV 的不同來判斷應該要連接的資料,例如在 dev DB 和 production DB 的分開等等情況。

3. ejs 樣板引擎快取問題

在樣板引擎方面我習慣 ejs,而 ejs 會在 production 的狀態下把 view template 快取起來,加速 render 的時間,因此需要做 restart node server 的情況才可以解決快取問題。

ps. 或許這個問題有其他更好解法,非常歡迎協助補充。

4. node 執行 .js 檔

因為曾經撞過這些雷,單純就是經驗不足,以致於值得記錄一下 XD

直接提供 debug 經驗談:

  • chmod -x yourfile.js // 權限問題
  • 讀檔&寫檔 // 請確定相對路徑絕對路徑在環境的問題
  • 第一行請加上 #!/usr/bin/env node // 讓環境找得到 node 去執行它

5. MongoDB 的匯出和匯入

Q:在本機端匯出和匯入都好好的,不知道為什麼到遠端的環境就沒有辦法匯入? A:原因是語系問題,記得在 DB 匯入前先執行 export 或寫入 bashrc 檔

export LC_ALL="en_US.UTF-8"

後記

花時間經歷過的才會印象深刻,上述這幾點都是我利用時間所換來的,將此記錄在這邊,也希望能或多或少幫助到一些人:)