2014-10-10 00:00

[API-d21] - 實戰開發 - 新增 TODO task API with mongoose

Github 參考

昨天我們了解了如何拿 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 如下:

image

POST 的 raw data

{ "content": "buy milk" }

於是就完成了一個 POST 新增 TODO 的 API 了!

Share

comments powered by Disqus