之前我們已經簡單的在Heroku上部署了正在開發的web應用, 現在我們的應用要使用MongoDB數據庫, 如何在雲端部署一個MongoDB連接呢?
再進一步, 最終我們的目的是生產和開發環境連接不同數據庫. 本文將完整敘述整個流程.
註冊MongoLab賬號
我們這裏將使用MongoLab, 首先需要註冊賬號, 相關文檔請見這裏
創建一個新數據庫
登陸後按照如下操作
選擇single node
, sandbox
, 注意, 只有特定的區域纔有single node
節點可選, 需要自己手動試一下哪個可行.
創建成功後的效果
如果沒有創建成功, 多半是數據庫名稱衝突了, 多試幾個就好.
點擊Name
進入數據庫, 提示要創建一個用戶來使用數據庫, 那麼我們切換到Users
標籤, 點擊add database user
配置Mongolab數據庫連接字符串到heroku的配置文件中
$ heroku config:set MONGOLAB_URI=mongodb://<dbuser>:<dbpassword>@ds127958.mlab.com:27958/congyh
Setting MONGOLAB_URI and restarting ⬢ sheltered-everglades-85543... done, v10
...
同步本地開發數據庫的測試數據到Mongolab
創建一個臨時文件夾, 用於本地開發數據庫的備份
$ mkdir -p ~/tmp/mongodump
備份本地開發數據庫
$ mongodump -h localhost:27017 -d Loc8r -o ~/tmp/mongodump
還原數據到雲端數據庫
$ mongorestore -h ds127958.mlab.com:27958 -d congyh -u <username> -p <password> ~/tmp/mongodump/Loc8r
...
2016-12-11T12:40:06.685+0800 finished restoring congyh.locations (3 documents)
2016-12-11T12:40:06.685+0800 done
檢查數據還原情況
首先使用mongo shell連接到遠程數據庫
$ mongo ds127958.mlab.com:27958/congyh -u <username> -p <password>
MongoDB shell version v3.4.0
connecting to: mongodb://ds127958.mlab.com:27958/congyh
MongoDB server version: 3.2.11
WARNING: shell and server versions do not match
rs-ds127958:PRIMARY>
列出數據
> show collections
> db.locations.find()
讓應用根據環境自動選擇連接的數據庫
經過以上操作, 我們獲得了一個和本地開發數據庫同步的雲端數據庫, 由於我們的應用同時在本地開發和Heroku部署, 需要讓應用根據環境自動連接到正確的數據庫.
設置NODE_ENV環境變量
首先需要將heroku上部署的應用切換到production
環境(注意: 要在應用根目錄下執行指令).
$ heroku config:set NODE_ENV=production
Setting NODE_ENV and restarting ⬢ sheltered-everglades-85543... done, v11
NODE_ENV: production
更改應用源碼中數據庫連接的設置
var dbURI = 'mongodb://localhost/Loc8r';
if (process.env.NODE_ENV === 'production') {
dbURI = process.env.MONGOLAB_URI;
}
mongoose.connect(dbURI);
本地測試連接到本地開發數據庫和Mongolab數據庫
首先測試連接到本地開發數據庫
$ nodemon
Mongoose connected to mongodb://localhost/Loc8r
然後測試連接到Mongolab數據庫
$ NODE_ENV=production MONGOLAB_URI=mongodb://<dbuser>:<dbpassword>@ds127958.mlab.com:27958/congyh nodemon
Mongoose connected to mongodb:///<dbuser>:<dbpassword>@ds127958.mlab.com:27958/congyh
測試成功後, 將應用推送到Heroku倉庫部署
$ git add .
$ git commit -am "add mongolab support"
$ git push heroku master
通過檢查heroku雲端應用日誌, 驗證數據庫連接情況
$ heroku logs
...
2016-12-11T05:08:18.152506+00:00 app[web.1]: Mongoose connected to mongodb://<dbuser>:<dbpassword>@ds127958.mlab.com:27958/congyh
以上, 就完成了生產和開發環境連接不同數據庫的配置.