NodeJS之express的路由淺析

路由路徑和請求方法一塊兒定義了請求的端點,它能夠是字符串、字符串模式或者正則表達式。後端在獲取路由後,可經過一系列相似中間件的函數去執行事務。html

可以使用字符串的路由路徑:正則表達式

// 匹配根路徑的請求
app.get('/', function (req, res) {
  res.send('root');
});

// 匹配 /about 路徑的請求
app.get('/about', function (req, res) {
  res.send('about');
});

// 匹配 /random.text 路徑的請求
app.get('/random.text', function (req, res) {
  res.send('random.text');
});

可以使用字符串模式的路由路徑:express

// 匹配 acd 和 abcd
app.get('/ab?cd', function(req, res) {
  res.send('ab?cd');
});

// 匹配 /abe 和 /abcde
app.get('/ab(cd)?e', function(req, res) {
 res.send('ab(cd)?e');
});

可以使用正則表達式的路由路徑:後端

// 匹配 butterfly、dragonfly,不匹配 butterflyman、dragonfly man等
app.get(/.*fly$/, function(req, res) {
  res.send('/.*fly$/');
});

能夠爲請求處理提供多個回調函數,其行爲相似中間件。惟一的區別是這些回調函數有可能調用 next('route') 方法而略過其餘路由回調函數。能夠利用該機制爲路由定義前提條件,若是在現有路徑上繼續執行沒有意義,則可將控制權交給剩下的路徑。數組

路由句柄有多種形式,能夠是一個函數、一個函數數組,或者是二者混合,以下所示app

使用一個回調函數處理路由:dom

app.get('/example', function (req, res) {
  res.send('Hello from A!');
});

使用多個回調函數處理路由(記得指定 next 對象):ide

app.get('/example/b', function (req, res, next) {
  console.log('response will be sent by the next function ...');
  next();
}, function (req, res) {
  res.send('Hello from B!');
});

使用回調函數數組處理路由:模塊化

var cb0 = function (req, res, next) {
  console.log('CB0');
  next();
}

var cb1 = function (req, res, next) {
  console.log('CB1');
  next();
}

var cb2 = function (req, res) {
  res.send('Hello from C!');
}

app.get('/example/c', [cb0, cb1, cb2]);

混合使用函數和函數數組處理路由:函數

var cb0 = function (req, res, next) {
  console.log('CB0');
  next();
}

var cb1 = function (req, res, next) {
  console.log('CB1');
  next();
}

app.get('/example/d', [cb0, cb1], function (req, res, next) {
  console.log('response will be sent by the next function ...');
  next();
}, function (req, res) {
  res.send('Hello from D!');
});

 

可以使用 express.Router 類建立模塊化、可掛載的路由句柄。Router 實例是一個完整的中間件和路由系統。

var log=require("./log/log");
var express=require("express");
var app=express();

//首先定義一個路由
var router=express.Router();

//使用中間件
router.use(function firstFunc(req,res,next){
    console.log("Time: ",Date.now());
    next();
});

//若是是根目錄
router.get("/",function(req,res){
    res.send("home page");
});

//若是是根目錄下的about目錄
router.get("/about",function(req,res){
    res.send("about page");
});

//使用路由
//可輸入http://127.0.0.1:8000/myRoot獲得home page
//可輸入http://127.0.0.1:8000/myRoot/about獲得about page
//在獲得返回的page以前,會先執行firstFunc函數
app.use("/myRoot",router);

//開啓站點
app.listen(8000,function(){
    log.info("站點開啓")
});

經過路由,能夠在返回頁面以前,先經過中間件執行若干事物,並且這些中間件是當前路由共享的,這樣能夠省去許多重複代碼,增長代碼可利用率的有效性。還能夠將Router註冊爲模塊導出,代碼更加有可讀性。

 

註明:以上學習內容來自:http://www.expressjs.com.cn/guide/routing.html

相關文章
相關標籤/搜索