nodejs?express路由匹配控制及Router模塊化使用詳解
路由控制匹配
本文主要分析下express的核心功能路由的使用。
express路由的匹配規(guī)則:
- 支持模糊匹配,同一個(gè)路由可能命中多個(gè)定義的路由
router.get("/user/*",(req,res,next)=>{
console.log("====demo====")
})
router.get("/user/list",(req,res,next)=>{
console.log("====demo====")
})
調(diào)用接口/user/list其實(shí)回同時(shí)匹配到定義的/user/*和/user/list兩個(gè)路由,但express還有個(gè)先后執(zhí)行的規(guī)則所以只會(huì)執(zhí)行前面定義的。
- 按照定義的先后順序進(jìn)行匹配
- 請(qǐng)求類型和請(qǐng)求的PATH同時(shí)匹配成功,才會(huì)算是成功命中路由調(diào)用其對(duì)應(yīng)的處理函數(shù)。
- 字符串匹配是我們常用的路由規(guī)則,以/來(lái)定義這中規(guī)則比較簡(jiǎn)單此處不在介紹。
- 字符串模版匹配
// 該路由匹配了1234和124
app.get('/12?34', function (req, res,next) {
res.send('-----字符串模板匹配-----')
})
// 該路由匹配了`1234`、`12234`、`122234`等。
app.get('/12+34', function (req, res,next) {
res.send('-----字符串模板匹配-----')
})
// 通配符*,表示所有字符串,該路由匹配了/12**所有路徑
app.get('/12*', function (req, res,next) {
res.send('-----字符串模板匹配-----')
})
占位符的路由,在回調(diào)函數(shù)中我們可以通過(guò)req.params[占位符的key]來(lái)取傳入占位符位置的值。
//此路由將匹配到/user/**(任意值)的路由
app.get('/user/:id', function (req, res,next) {
res.send('-----占位符-----',req.params.id)
})
注:占位符定義規(guī)則只能是大小寫(xiě)字符數(shù)字和下劃線[A-Za-z0-9_]
- 正則匹配:可以寫(xiě)正則表達(dá)式來(lái)作為路由的匹配規(guī)則,正則表達(dá)雖然不易讀,但是非常適合來(lái)定義一些復(fù)雜的路由。
// 表示路由必須有user+數(shù)字+小寫(xiě)字母組成
app.get(/user\/[0-9]\/[a-z]/, function (req, res) {
res.send('/b/')
})
注:express的路由匹配規(guī)則原理使用Path-to-RegExp來(lái)實(shí)現(xiàn),有興趣可以去看看。
- 路由控制轉(zhuǎn)移:上面說(shuō)路由的規(guī)則支持模糊匹配,同一個(gè)路由可能命中多個(gè)定義的路由,但是由于先后順序規(guī)則只會(huì)執(zhí)行第一個(gè),那如果我們也想執(zhí)行后面定義的路由咋辦呢?此時(shí)回調(diào)函數(shù)的第三個(gè)參數(shù)next就起到了路由控制轉(zhuǎn)移的功能
router.get("/user/*",(req,res,next)=>{
console.log("demo1")
next()
})
router.get("/user/list",(req,res,next)=>{
console.log("demo2")
})
當(dāng)請(qǐng)求/user/list時(shí)候回打?。篸emo1 和 demo2
Router模塊化路由
Router路由是express4.x后加入的api,這個(gè)方便了我們項(xiàng)目的解藕,通過(guò)模塊化路由我們可以將應(yīng)用中不同的功能封裝成一個(gè)個(gè)的模塊。
使用方式
- 定義相關(guān)的模塊demo.js文件
- 在模塊demo.js文件中引入Router,并定義相關(guān)路由和回調(diào)
- 模塊demo.js文件中導(dǎo)出router對(duì)象
//demo.js
let express = require('express');
let router = express.Router();
router.get("/user",(req,res,next)=>{
console.log("====demo====")
})
module.exports = router
- 入口文件引入模塊js文件,并作為中間件注入到app路由上,并加上相應(yīng)的前綴
let express = require('express');
let app = express();
// 引入demo.js
let demoRoutes = require('./demo.js');
app.use('/demo',demoRoutes)
app.listen(3000);
對(duì)比app上的路由
- 模塊化路由Router與app上的路由在功能上沒(méi)有任何區(qū)別,都是處理中間件和路由。
- 模塊化路由Router只能已模塊形式存在并不能在沒(méi)有app路由下單獨(dú)運(yùn)行。
- 簡(jiǎn)單的應(yīng)用app就可以直接處理,復(fù)雜需要引入Router方便模塊化和項(xiàng)目的后期擴(kuò)展
總結(jié)
express中路由的處理是整個(gè)express的核心功能之一,這個(gè)也是express能快速開(kāi)發(fā)項(xiàng)目的基礎(chǔ)。要想用好express那掌握其路由規(guī)則是必不可少的學(xué)習(xí)。另外最后能去看下其源碼的實(shí)現(xiàn)。
- 參考文檔1:Express 文檔(路由)
- 參考文檔2:Express 文檔
- 參考文檔3Express 實(shí)戰(zhàn)(五):路由
以上就是nodejs express路由匹配控制及Router模塊化使用詳解的詳細(xì)內(nèi)容,更多關(guān)于nodejs express路由匹配Router的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
實(shí)戰(zhàn)node靜態(tài)文件服務(wù)器的示例代碼
本篇文章主要介紹了實(shí)戰(zhàn)node靜態(tài)文件服務(wù)器的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03
node.js中的http.request方法使用說(shuō)明
這篇文章主要介紹了node.js中的http.request方法使用說(shuō)明,本文介紹了http.request的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼需要的朋友可以參考下2014-12-12
nodejs使用Sequelize框架操作數(shù)據(jù)庫(kù)的實(shí)現(xiàn)
這篇文章主要介紹了nodejs使用Sequelize框架操作數(shù)據(jù)庫(kù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Node.js學(xué)習(xí)教程之HTTP/2服務(wù)器推送【譯】
這篇文章主要給大家介紹了關(guān)于Node.js學(xué)習(xí)教程之HTTP/2服務(wù)器推送的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
從零學(xué)習(xí)node.js之mysql數(shù)據(jù)庫(kù)的操作(五)
因?yàn)榻佑|Node.JS已經(jīng)有一段時(shí)間了,最近粗略的研究了一下node.js操作數(shù)據(jù)庫(kù)的包,覺(jué)得node.js連接數(shù)據(jù)庫(kù)不錯(cuò)。下面這篇文章主要給大家介紹了node.js之mysql數(shù)據(jù)庫(kù)操作的相關(guān)資料,需要的朋友可以參考下。2017-02-02
NodeJS和BootStrap分頁(yè)效果的實(shí)現(xiàn)代碼
這篇文章主要介紹了NodeJS和BootStrap分頁(yè)效果的實(shí)現(xiàn)代碼的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11
使用Node實(shí)現(xiàn)Git倉(cāng)庫(kù)批量克隆的操作步驟
分享一個(gè)node腳本,通過(guò)調(diào)用gitee的OpenApi獲取自己的代碼倉(cāng)庫(kù)列表,達(dá)到批量克隆項(xiàng)目的效果,文中通過(guò)代碼示例和圖文講解的非常詳細(xì),感興趣的小伙伴可以參考閱讀一下2024-04-04

