Express基礎瞭解—路由

Cacra發表於2018-07-25

主要是根據官方文件和網上資料整理的。

路由的定義由如下結構組成:

app.METHOD(PATH, HANDLER)。

其中,app 是一個 express 例項;METHOD 是某個 HTTP 請求方式中的一個;PATH 是伺服器端的路徑;HANDLER 是當路由匹配到時需要執行的函式。

簡單例項:

var express = require('express');
var app = express();

// respond with "hello world" when a GET request is made to the homepage
app.get('/', function(req, res) {
  res.send('hello world');
});

路由路徑:

路由路徑和起起伏伏一起定義了請求的端點,它可以是字串、字串模式或者正規表示式。

# 1.使用字串的路徑路由
//匹配根路徑的請求
app.get('/', function (req, res) {
  res.send('root');
});

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

# 2.使用字串模式的路由路徑
// 匹配 acd 和 abcd
app.get('/ab?cd', function(req, res) {
  res.send('ab?cd');
});

// 匹配 abcd、abbcd、abbbcd等
app.get('/ab+cd', function(req, res) {
  res.send('ab+cd');
});

# 3.使用正規表示式的路由路徑
// 匹配任何路徑中含有 a 的路徑:
app.get(/a/, function(req, res) {
  res.send('/a/');
});

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

路由控制程式碼:

可以為請求提供多個回撥函式,其行為類似中介軟體。

唯一的區別是這些回撥函式有可能呼叫next(‘route’)方法而略過其他路由回撥函式。可以利用該機制為路由定義前提條件,如果在現有路徑上繼續執行沒有意義,則可將控制權交給剩下的路徑。

路由控制程式碼有多種形式,可以是一個函式、一個函式陣列,或者是兩者混合。

1.使用一個回撥函式處理路由:

app.get('/example/a', function (req, res) {
  res.send('Hello from A!');
});
使用多個回撥函式處理路由(記得指定 next 物件):

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!');
});

2.使用回撥函式陣列處理路由:

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]);

3.混合使用函式和函式陣列處理路由:

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!');
});

app.route():

可使用 app.route() 建立路由路徑的鏈式路由控制程式碼。由於路徑在一個地方指定,這樣做有助於建立模組化的路由,而且減少了程式碼冗餘和拼寫錯誤。

下面這個示例程式使用 app.route() 定義了鏈式路由控制程式碼。

app.route('/book')
  .get(function(req, res) {
    res.send('Get a random book');
  })
  .post(function(req, res) {
    res.send('Add a book');
  })
  .put(function(req, res) {
    res.send('Update the book');
  });

express.Router:

可以使用express.Router類建立模組化、可掛載的路由控制程式碼。(也就是相對於一個公共模組,各個程式都可以進行呼叫使用)。

Router 例項是一個完整的中介軟體和路由系統,因此常稱其為一個 “mini-app”。

下面的例項程式建立了一個路由模組,並載入了一箇中介軟體,定義了一些路由,並且將它們掛載至應用的路徑上。

例項1:

var express = require('express');

// 路由中介軟體
var router = express.Router();

router.get('/',function (req,res,next) {
    res.send('root');
})

// 路由中介軟體 匯出
module.exports = router;

路由中介軟體的使用:

var express = require('express');
var app = express();

// 引入 路由中介軟體
var indexRouter = require('./test3')

// 路由中介軟體的使用
app.use('/',indexRouter);

app.listen(3000);
console.log('Listen to port 3000');

例項2:

var express = require('express');
var router = express.Router();

// 該路由使用的中介軟體
router.use(function timeLog(req, res, next) {
  console.log('Time: ', Date.now());
  next();
});
// 定義網站主頁的路由
router.get('/', function(req, res) {
  res.send('Birds home page');
});
// 定義 about 頁面的路由
router.get('/about', function(req, res) {
  res.send('About birds');
});

module.exports = router;

然後再應用中載入路由模組:

var birds = require('./birds');
...
app.use('/birds', birds);

應用即可處理髮自 /birds 和 /birds/about 的請求,並且呼叫為該路由指定的 timeLog 中介軟體。

app.get() 和 app.use() :

參考文章:https://blog.csdn.net/wthfeng/article/details/53366169

結論:

  • app.use(path,callback)中的callback既可以是router物件又可以是函式
  • app.get(path,callback)中的callback只能是函式

index.js


var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
  res.send('hello world!');
});

module.exports = router;

app.js

var express = require('express');
var app = express();

var index = require('./routes/index');

//1
app.use('/test1',function(req,res,next){
    res.send('hello test1');

});

//2
app.get('/test2',function(req,res,next){
    res.send('hello test2');

});

//3
app.get('/test3',index);

//4
app.use('/test4',index);

index是一個路由物件,結果,例1、2、4結果都能正確顯示,而例3卻報404。這說明,給app.get(app.post、app.put同理)賦個路由物件是不行的。

其實,可以將app.get()看作app.use的特定請求(get)的簡要寫法。即:

var express = require('express');
var app = express();
app.get('/hello',function(req,res,next){
    res.send('hello test2');

});

等同於:

var express = require('express');
var app = express();
var router = express.Router();

router.get('/', function(req, res, next) {
  res.send('hello world!');
});

那麼,什麼時用app.use(),什麼時用app.get()呢?

路由規則是app.use(path,router)定義的,router代表一個由express.Router()建立的物件,在路由物件中可定義多個路由規則。可是如果我們的路由只有一條規則時,可直接接一個回撥作為簡寫,也可直接使用app.get或app.post方法。即

當一個路徑有多個匹配規則時,使用app.use,否則使用相應的app.method(get、post)。可以參考express.Router的用法。

# 1. 定義多個路徑匹配規則
var express = require('express');
var router = express.Router();

// 該路由使用的中介軟體
router.use(function timeLog(req, res, next) {
  console.log('Time: ', Date.now());
  next();
});
// 定義網站主頁的路由
router.get('/', function(req, res) {
  res.send('Birds home page');
});
// 定義 about 頁面的路由
router.get('/about', function(req, res) {
  res.send('About birds');
});

module.exports = router;

# 2. 使用require,就可以使用匯出的模組,然後使用app.use()呼叫。
var birds = require('./birds');
...
app.use('/birds', birds);

關於app.get()和route.get()區別可以參考:https://segmentfault.com/q/1010000008112982

相關文章