2014年6月15日 星期日

Express 4 來了!好用的 Router 機制

Standard
還記得前陣子,就在書將出版之際,半路殺出來最新的 Express 4,使得筆者手忙腳亂,緊急通知出版社修改書的內容。將所有使用到 Express 的範例,都特別加上版本號的指定,讓讀者在照著範例做時,能夠使用舊的 Express 3.0,而不會發生任何問題。最新的 Express 4 雖然效能提升不少,也有一些好用的新東西,但和舊版有些微 API 的不相容,此外,也因為是新東西,可能很多東西的支援會發生問題,如果舊版本在上線的產品中運行相當穩定,建議先不要急著升級。

Express 4 做了一些改進,有不少新東西,其中相當值得提的一項就是路由機制(Router)的翻新。如果你以前在使用 Node.js + Express 開發網站服務時,因為 Router 很難管理而痛苦不已,這將是一個你會愛上的功能改進。

傳統的使用方法

傳統的 Router 設定方法依然可以運作,我們可以放心使用。

var express = require('express');

// Create express application
var app = express();

// Apply this router on (/apis/user)
app.get('/', function(req, res) {
    // Home
});
app.listen(8000);


新 Router 物件的使用方法範例

除了舊的方法之外,你可以用 Router() 去建立一個 Express 的 Router 物件,然後管理你一系列的路由規則。

var express = require('express');

// Create express application
var app = express();

// Create a router to handle routes for a set of  user API
var userAPI = express.Router();

// Sign in (/apis/user/signin)
userAPI.post('/signin', function(req, res) {
    // ...
});

// Sign out (/apis/user/signout)
userAPI.get('/signout', function(req, res) {
    // ...
});

// Sign up (/apis/user/signup)
userAPI.post('/signup', function(req, res) {
    // ...
});

// Apply this router on (/apis/user)
app.use('/apis/user', userAPI);
app.listen(8000);

一次指定多種方法到同個路徑

有時候,同一個路徑我們想賦予他不同的方法(如:GET 或 POST),讓它有不同的功能。這尤其是在開發 Restful API 時,非常常用。像是如果我們要設計一套管理使用者帳號(User)的 API 時。

var userMgrAPI = express.Router();
// A set of API to manage users (/apis/admin/user/:username)
userMgrAPI.route('user/:username')
    .get(function(req, res) {
        // Getting user information
    })
    .post(function(req, res) {
        // Create a new user
    })
    .delete(function(req, res) {
        // Delete specific user
    })
    .put(function(req, res) {
        // Update
    });

app.use('/apis/admin', userMgrAPI);

檢查 Parameter 的 Middleware

前面的例子,在路由上設計了一個 username 的 Parameter,每個方法的 Handler 都會用到它。但有一個需求是,既然每個 Handler 都會用到這個 Parameter,也需要檢查這個使用者帳號是否存在,那麼是否可以用類似 Middleware 的做法,寫一次程式套用在所有方法上?

答案是可以的,你可以直接使用 param() 設計一個 Middleware,去安插一個檢查程式在前面,並指定他要檢查什麼 Parameter 欄位。

userMgrAPI.param('username', function(req, res, next, username) {
    if (username == 'fred') {
        next();
    }else {
        res.send(404);
    }
});

// userMgrAPI.route('user/:username') ...

設計一個其他的 Middleware

如果你過去已經熟悉 Express 的開發,應該對開發一個 Middleware 不陌生,在 Express 4 的 Router 上,你也可以引用。通常我們會設計一個 Middleware 去檢查使用者登入與否,或是前面例子所提及的,檢查使用者是否存在,而不需要在每個路徑的 Handler 中都寫一次。

下面的例子和前一個例子有相同功能:
userMgrAPI.use(function(req, res, next) {
    if (req.params.username == 'fred') {
        next();
    }else {
        res.send(404);
    }
});

// userMgrAPI.route('user/:username') ...

後記


Express 4 帶來了新的方法,讓我們可以更好的管理 Router,這讓開發者們可以輕鬆許多,如果你有新的專案要開跑,不妨快來嘗試一下全新的 Express!