Cloud Foundry 是開放源碼的 PaaS 解決方案,支援多種程式語言、開發框架及資料庫等服務,而且更容易開發、測試及佈署。本系列文章將從零開始,和學習者一起開啟雲端應用程式開發的大門。
Node.js Express + Mongoose 存取 MongoDB 資料庫範例。
回到之前建立的 Express 專案,我們開始實作一個存取 MongoDB 資料庫的範例程式。
在 package.json 加入「mongoose」及「cloudfoundry」的 dependencies 設定:
::
"dependencies": {
"express": "3.0.0rc5",
"jade": "*",
"mongoose": "*",
"cloudfoundry": "*"
}
然後使用 NPM 安裝套件。
::
npm install
這個新安裝的套件「mongoose」是 Node.js 的 MongoDB 函式庫,直接使用 Node.js 的 MongoDB Driver 相當麻煩,一個簡單的查詢就需要多層的 JavaScript closure;搭配 mongoose 不僅簡化查詢所需的語法,也提供類似 ORM(物件關聯映射)設計。
我們延續之前使用的應用程式命名「myfirstnode」,並建立一個新的服務:
::
vmc create-service mongodb
如果建立成功,VMC 會有以下訊息:
::
Creating Service [mongodb-9bd2c]: OK
由以上訊息可知新服務名稱是「mongodb-9bd2c」,我們還需要將服務和應用程式綁定(bind),才能開始在應用程式中存取服務。
::
vmc bind-service mongodb-9bd2c myfirstnode
以下的範例程式加在 var app = express(); 前面,使用 MongoDB 記錄應用程式啟動次數。
::
var mongoose = require('mongoose');
var cloudfoundry = require('cloudfoundry');
var credentials = JSON.parse(process.env.VCAP_SERVICES)['mongodb-2.0'][0]['credentials'];
var db = mongoose.createConnection("mongo://"
var Counter = new mongoose.Schema ({name: String, num: Number});
mongoose.model('Counter', Counter);
var Counter = db.model('Counter');
Counter.findOne({name: 'startup'}, function(err, counter) {
if(!err) {
if (!counter) {
counter = new Counter();
counter.num = 0;
}
counter.num++;
counter.save(function(err) {
if(!err) {
console.log('could not save counter');
}
});
}
});
重新發佈應用程式:
::
vmc update myfirstnode
接下來建立通道(tunnel),以方便使用 MongoDB Client 手動查詢資料庫內容:
::
vmc tunnel mongodb-9bd2c
執行以上的指令,會詢問 Cloud Foundry 的密碼,輸入後會上傳「caldecott」這個程式。
看到以下的詢問,輸入 2 選擇「mongo」指令(MongoDB 內建的 Client 程式)。
::
Starting tunnel to mongodb-9bd2c on port 10000.
1: none
2: mongo
Which client would you like to start?:
你會看到類似以下的訊息,代表 VMC 已經幫你建立一個 MongoDB Client 到 PaaS MongoDB 資料庫的特殊連線:
::
Launching 'mongo --host localhost --port 10000 -u 6f3aab6a-574e-4901-a0c5-6a42a2a78d49 -p 56201b90-74e1-4898-8779-943a184277fa db'
在 MongoDB Client 直接輸入 MongoDB 查詢語法(JavaScript):
::
db.Counter.find();
就可以看到在 Node.js 程式中寫入 MongoDB 的資料。