Express基礎瞭解—路由
主要是根據官方文件和網上資料整理的。
路由的定義由如下結構組成:
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
相關文章
- Express基礎瞭解—模板引擎Express
- Express基礎瞭解—中介軟體Express
- 帶你瞭解動態路由協議OSPF基礎路由協議
- Angular路由——路由基礎Angular路由
- Nginx深入瞭解-基礎(一)Nginx
- Nginx深入瞭解-基礎(三)Nginx
- Java基礎系列:瞭解ArrayListJava
- 初步瞭解Express(基於node.js的後端框架)ExpressNode.js後端框架
- webpack 基礎入門 - 瞭解webpackWeb
- React路由(基礎)React路由
- 2.C_Sharp基礎深入瞭解
- Maven基礎瞭解及配置資訊Maven
- 移動端開發基礎瞭解
- express原始碼分析-路由Express原始碼路由
- 深入瞭解Android藍芽Bluetooth——《基礎篇》Android藍芽
- 一文帶你瞭解nginx基礎Nginx
- Flutter環境配置 + 基礎知識瞭解Flutter
- java基礎-多執行緒初步瞭解Java執行緒
- [JS基礎] 帶你深入瞭解JS原型JS原型
- 你真的瞭解前端路由嗎?前端路由
- vue-router路由基礎Vue路由
- 360 秒瞭解 SmartX 超融合基礎設施
- 網路營銷的基礎知識瞭解
- Express原始碼學習-路由篇Express原始碼路由
- Django基礎之二(URL路由)Django路由
- Thinkphp5基礎——09 路由PHP路由
- Flutter - 路由管理 - 01 - 基礎使用Flutter路由
- Vue開發之基礎路由Vue路由
- Linux基礎命令---IP路由操作Linux路由
- 交換機及路由基礎路由
- 帶你瞭解Typescript的14個基礎語法TypeScript
- CTF入門學習2->Web基礎瞭解Web
- 面試官: 你瞭解前端路由嗎?面試前端路由
- 阿里P7:你瞭解路由嗎?阿里路由
- 路由器基礎介紹,及配置靜態路由,預設路由路由器
- 零基礎瞭解3D遊戲開發3D遊戲開發
- 從原始碼瞭解Flutter的渲染基礎:Widget/Element/RenderObject原始碼FlutterObject
- Java基礎之淺談異常與瞭解斷言Java