學習使用ExpressJS 4.0中的新Router

概述

ExpressJS 4.0中提出了新的路由Router。Router比如是一個「迷你版」的express應用,它沒有引入views或者settings,可是提供了路由應有的API,.use.get,.paramroute前端

示例應用

讓咱們建立一個express應用,僅僅有少許routes和功能:node

  • 基礎路由:HomeAbout
  • 一個把request請求打印到console的路由中間件
  • 一個帶參數的路由
  • 一個校驗特殊參數的路由中間件
  • 一個用於登陸的路由,響應對與路徑/login的GET和POST請求
  • 校驗功能:校驗傳遞給某一個路由的參數

應用文件架構

咱們只須要兩個文件:express

- package.json  // 構建node應用所須要的插件
- server.js     // 構建示例應用的啓動文件

咱們會把路由代碼寫如server.js文件。未來爲了讓示例應用模塊化,咱們會把這些路由代碼分別寫入不一樣的文件,甚至能夠爲網站的不一樣組成部分單獨定義不一樣的路由文件。npm

建立Node應用

建立node應用,咱們須要編寫package.json文件去定義node應用依賴的插件。json

{
    "name": "express-router-experiments",
    "main": "server.js",
    "dependencies": {
        "express": "~4.0.0"
    }
}

下面繼續安裝依賴:瀏覽器

$ npm install

如今咱們安裝了Express,讓咱們繼續編寫server.js去處理路由。架構

建立server

咱們在package.json中指定了main屬性值爲server.js,所以Express會使用server.js做爲應用的入口文件。app

// server.js

// 基礎設置
// ==============================================

var express = require('express');
var app     = express();
var port    =   process.env.PORT || 8080;

// 路由
// ==============================================

// 示例路由
app.get('/sample', function(req, res) {
    res.send('this is a sample!');  
});

// 咱們會在這裏編寫本身的路由

// 啓動server
// ==============================================
app.listen(port);
console.log('Magic happens on port ' + port);

如今咱們可使用命令node server.js啓動server。咱們使用app.get建立了一個Express 3時代的路由,若是此時打開瀏覽器訪問http://localhost:8080/sample,咱們就能看到這樣下面的文字:this is a sample!模塊化

基本用法 express.Router()

下面咱們一塊兒編寫Node應用前端路由的例子,包括Home頁面和About頁面。函數

// server.js

...

// 獲取router實例
var router = express.Router();

// home頁面路由(http://localhost:8080)
router.get('/', function(req, res) {
    res.send('im the home page!');  
});

// about頁面路由(http://localhost:8080/about)
router.get('/about', function(req, res) {
    res.send('im the about page!'); 
});

// 把定義好的路由集成到Node應用中
app.use('/', router);

...

咱們前面的代碼使用express.Router()生成一個路由實例,並定義路由規則,最後把這個路由實例集成到應用中。如今咱們能夠經過http://localhost:8080訪問Home頁面,經過http://localhost:8080/about訪問about頁面。

請注意:咱們能夠改變前面定義的路由中默認的根路徑('/')。若是咱們把app.use('/', router)改成app.use('/app', router),那麼home頁面的訪問地址變爲http://localhost:8080/app,about頁面的訪問地址變爲http://localhost:8080/app/about

這是一個很是有用的功能,咱們能夠利用它建立多個路由實例express.Router()並把這些實例都集成到Node應用中。例如,能夠在Node應用中針對不一樣功能需求建立不一樣的路由:一個基礎路由,一個用於權限校驗的路由和其餘API路由。如此一來,Node應用變得更加模塊化更容易擴展。

建立路由中間件Router.use()

路由中間件實際是一種容許一個request請求被處理以前進行某些操做的機制。例如,在把一個request請求的響應數據返回給用戶以前,咱們能夠檢查用戶是否有權限,能夠記錄日誌等等。
下面咱們實現一個打印日誌的中間件,每次有一個request請求,咱們就在console打印一條信息。

// server.js

...

// 獲取router實例
var router = express.Router();

// 路由中間件:每當有一個request請求都會執行
router.use(function(req, res, next) {

    // 打印request的method和url
    console.log(req.method, req.url);

    // 繼續處理request請求,尋找匹配的路由
    next(); 
});

// home頁面路由 (http://localhost:8080)
router.get('/', function(req, res) {
    res.send('im the home page!');  
});

// about頁面路由 (http://localhost:8080/about)
router.get('/about', function(req, res) {
    res.send('im the about page!'); 
});

// 把定義好的路由集成到Node應用中
app.use('/app', router);

...

咱們用router.use()用來定義了路由中間件,而且把它應用到全部訪問咱們Node應用的請求上。打開瀏覽器訪問http://localhost:8080/app,咱們能夠看到console打印的信息:im the home page!

在代碼中,中間件和路由的位置順序很是重要。一個request請求到來時,它們會按照代碼中的前後順序依次執行。這就意味着若是你把中間件寫在某一個路由的後面,路由會攔截這個request請求並完成響應,中間件則永遠不會被執行。

帶參數的路由 /hello/:name

咱們想要在URL中傳遞一我的的名字name,讓NODE應用輸出 Hello name! 這裏可使用帶參數的路由。

// server.js
...
// 獲取router實例
var router = express.Router();
...

// 帶參數的路由 (http://localhost:8080/hello/:name)
router.get('/hello/:name', function(req, res) {
    res.send('hello ' + req.params.name + '!');
});

// 把定義好的路由集成到Node應用中
app.use('/', router);
...

如今咱們訪問http://localhost:8080/hello/holly就能夠看到瀏覽器頁面展現的信息:

Hello holly!

建立參數中間件

若是想要校驗上面傳入URL的人的名字,確保名字是符合規範的,咱們須要在路由中間件中去校驗URL中的參數name。它有個特殊的名字,參數中間件。咱們可使用express.param()去建立它。

// server.js
...

// 獲取router實例
var router = express.Router();

...

// 參數中間件 校驗name參數
router.param('name', function(req, res, next, name) {
    // 在這裏進行校驗操做
    console.log('doing name validations on ' + name);

    // 校驗經過咱們把校驗後的名字賦值給req對象
    req.name = name;
    // 繼續處理request請求,尋找匹配的路由
    next(); 
});

// 帶參數的路由 (http://localhost:8080/hello/:name)
router.get('/hello/:name', function(req, res) {
    res.send('hello ' + req.name + '!');
});

// 把定義好的路由集成到Node應用中
app.use('/', router);

如今當咱們訪問到/hello/:name路由,咱們編寫的參數中間件就會介入並作相應的校驗處理。校驗經過咱們把校驗後的名字賦值給req對象,並在相應的.get路由中使用req.name獲取校驗後的名字。打開瀏覽器,訪問http://localhost:8080/hello/sally,咱們能夠看到瀏覽器展現的信息:

Hello sally!

console控制檯打印出:

doing name validations on sally

若是你使用RESTful API,你甚至能夠校驗token是否有效,來判斷用戶是否有權限訪問。

鏈式路由

咱們也能夠直接在app對象上建立路由。利用app.route()能夠針對一個路由定義多個路由處理函數。例如,對/login路由發起get請求,展現登陸界面,同時也能夠對/login路由發起post請求,提交登陸表單信息。咱們就可使用app.route來建立這個/login路由。

// ROUTES
// ==============================================

app.route('/login')

    // 展現登陸界面 (GET http://localhost:8080/login)
    .get(function(req, res) {
        res.send('this is the login form');
    })

    // 提交登陸表單 (POST http://localhost:8080/login)
    .post(function(req, res) {
        console.log('processing');
        res.send('processing the login form!');
    });

...

總結

使用Express 4.0中的路由,咱們能夠更靈活的定義路由:

  • 屢次使用express.Router()定義一組路由
  • 使用express.Router()劃分模塊,並用app.use()把他們整合起來
  • 使用路由中間件對request請求進行預處理
  • 使用參數中間.param()件對URL中參數進行校驗
  • 使用app.route()建立鏈式路由
相關文章
相關標籤/搜索