小弟的規劃表 - http://blog.kerkerj.in/blog/2014/11/01/planning/
好讀版 - http://blog.kerkerj.in/blog/2014/10/21/api-d21/
昨天我們瞭解了如何拿 url params 以及 request data
今天我們就來使用他,對資料庫做存取
由於使用到資料庫,因此我們要加入資料庫的 driver
我們用的是 mongoose 套件
app.js:
// 在最上方加入
var mongoose = require('mongoose');
// 在某個地方連接資料庫
var db_uri = "mongodb://192.168.33.10:27017/TODOs";
mongoose.connect(db_uri);
在這邊我是使用了虛擬機的 DB,因此是 mongodb://192.168.33.10:27017/TODOs
DB 的名稱為 TODOs
這樣在程式一跑起來時,就會連接資料庫了!
再來我們就要設定在對資料庫做 CRUD 時,所需要做的事情
首先我們先要定義 schema,
雖然 mongodb 是 schema-free,但是官方文件也有提到最好還是有固定的 schema 避免記憶體 allocate 時出現問題,而程式撰寫時邏輯也不會因此而過於複雜
這時候我們就需要 model 資料夾了,在 model 資料夾中新增一個 todos.js
裡面要放的就是 todo task 的 schema
內容如下:
models/todos.js:
'use strict';
var mongoose = require('mongoose');
// Define our todo schema
var TODOschema = new mongoose.Schema({
user_id: String,
content: String,
created_at: Date,
updated_at: Date
});
// Export the Mongoose model
module.exports = mongoose.model('TODO', TODOschema);
我們定義了幾個東西 user_id, content, created_at, updated_at
其實 ObjectID 中已經有包含建立資訊了,其實 created_at 是可以省略掉的,不過在這邊還是加一下
注意下面這行:
module.exports = mongoose.model('TODO', TODOschema);
『TODO' 在這邊是 Collection (RDBMS 中的 table) 的名稱
在 mongoose 中,會自動複數化,所以在 Mongodb 中的 Collection name 會變成 『todos' ,
雖然只是小小的一行,但是蠻重要的
最後將這個 model exports 成一個 mongoose.model 物件
那我們什麼時候會用到這個 model 物件呢?
就是在 routes/user.js 中,
routes/users.js:
var TODO = require('../models/todos');
這樣在 users.js 中就可以使用 TODO 這個物件了!
我們先試著編輯 POST 的 route,拿到 POST 資料後,將資料轉成 TODO 的物件,存到 mongodb 裡
以下是 routes/users.js 中的 post 程式碼段
簡單來說就是先抓到 uri 的參數以及 post data
並且使用 models/todos.js 的 model 新建立一個 todo 物件
並將該物件用 post data 初始化,
初始化完後就執行寫入 DB 的行為, 若寫入成功則回傳 201 + data
失敗則回傳 400 bad request
// Create a todo task
router.post('/:user_id/todos', function(req, res) {
var user_id = req.params.user_id;
var data = req.body;
// insert to db
var todo = new TODO();
todo.user_id = user_id;
todo.content = data.content;
todo.created_at = Date.now();
todo.updated_at = Date.now();
todo.save(function (err) {
if (err) {
res.status(400).json(
{ error: "insert db error" }
);
} else {
res.status(201).json(
todo
);
}
});
});
試著執行伺服器看看,並且使用 POSTMAN 丟 request 如下:
POST 的 raw data
{ "content": "buy milk" }
於是就完成了一個 POST 新增 TODO 的 API 了!