express高效入門教程(3)

3.路由

路由到底是什么呢火本?不管官方定義到底是什么逗宜,咱通俗的說就是根據(jù)不同的url,執(zhí)行不同的代碼叹话,類似于編程語言中的分支結(jié)構(gòu)

#3.1.express規(guī)劃路由

稍微復(fù)雜點的應(yīng)用朝墩,通常都是分模塊進行的醉拓,例如:

image

我們從中挑選幾個模塊進行路由規(guī)劃,在我們的后臺模塊里面收苏,可以實現(xiàn)用戶的管理亿卤,課程的管理,友情鏈接管理等鹿霸,我們的訪問地址可能是這樣的

// 1.用戶管理
// 用戶列表
http://localhost:8090/admin/user/list
// 添加用戶
http://localhost:8090/admin/user/add
// 刪除用戶
http://localhost:8090/admin/user/delete
// 編輯用戶
http://localhost:8090/admin/user/edit

// 2.課程管理
// 課程列表
http://localhost:8090/admin/course/list
// 添加用戶
http://localhost:8090/admin/course/add
// 刪除用戶
http://localhost:8090/admin/course/delete
// 編輯用戶
http://localhost:8090/admin/course/edit

...

在沒有拆分路由的情況下排吴,我們需要在app.js里面寫這些代碼

/**
 * 用戶管理模塊
 */
app.get('/admin/user/list', function (req, res) {
  res.send('用戶列表')
})
app.get('/admin/user/add', function (req, res) {
  res.send('添加用戶')
})
app.get('/admin/user/delete', function (req, res) {
  res.send('刪除用戶')
})
app.get('/admin/user/edit', function (req, res) {
  res.send('更新用戶')
})

/**
 * 課程模塊
 */
app.get('/admin/course/list', function (req, res) {
  res.send('課程列表')
})
app.get('/admin/course/add', function (req, res) {
  res.send('添加課程')
})
app.get('/admin/course/delete', function (req, res) {
  res.send('刪除課程')
})
app.get('/admin/course/edit', function (req, res) {
  res.send('更新課程')
})

當(dāng)上面的代碼都寫到app.js中,代碼會顯得非常臃腫懦鼠,最佳的實踐是把這些模塊拆分出去傍念,express中提供了拆分的方法

第一步,我們在項目根目錄下面葛闷,新建一個router目錄,在這個目錄下面按模塊名字分別創(chuàng)建user.js和course.js

image

第二步双藕,在user.js文件中淑趾,創(chuàng)建router,并導(dǎo)出

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

// ...  中間寫對應(yīng)的路由方法

module.exports = router

第三步忧陪,把對應(yīng)的路由方法添加到user.js中

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

router.get('/admin/user/list', function (req, res) {
  res.send('用戶列表')
})
router.get('/admin/user/add', function (req, res) {
  res.send('添加用戶')
})
router.get('/admin/user/delete', function (req, res) {
  res.send('刪除用戶')
})
router.get('/admin/user/edit', function (req, res) {
  res.send('更新用戶')
})

module.exports = router

經(jīng)過前面步驟扣泊,我們完成了user模塊路由拆分

接下來,我們可以按照這種方式嘶摊,把course模塊拆分出來

// course.js文件代碼

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

router.get('/admin/course/list', function (req, res) {
  res.send('課程列表')
})
router.get('/admin/course/add', function (req, res) {
  res.send('添加課程')
})
router.get('/admin/course/delete', function (req, res) {
  res.send('刪除課程')
})
router.get('/admin/course/edit', function (req, res) {
  res.send('更新課程')
})

module.exports = router

當(dāng)我們各個路由模塊都拆分完成后延蟹,如何使用這些模塊呢?

在app.js中叶堆,我們需要引入創(chuàng)建好的路由模塊

var userRouter = require('./router/user')
var courseRouter = require('./router/course')

接下來阱飘,掛載到express上

app.use('/', userRouter)
app.use('/', courseRouter)

經(jīng)過以上步驟,我們已經(jīng)把路由模塊完全拆分出去了

#3.2.對路由模塊進行多級拆分

前面我們已經(jīng)把模塊劃分出來了,我們在寫路由方法的時候是這樣的:

router.get('/admin/user/list', function (req, res) {
  res.send('用戶列表')
})

從代碼中我們可以看成沥匈,寫路徑的時候會寫一長串蔗喂,/admin/user/list,這樣寫比較麻煩高帖,同時缰儿,我們更希望大模塊直接有更好的劃分,例如散址,我們的系統(tǒng)總體上劃分為前臺模塊和后臺模塊乖阵,那我們的router目錄組織結(jié)構(gòu)應(yīng)該是這樣的:

image

admin文件夾下面放的都是關(guān)于后臺路由的模塊,home目錄下面放的都是前臺路由的模塊预麸,這個時候瞪浸,我們需要對路由做進一步拆分,以拆分admin為例:

第一步:在admin/index.js下面 引入其他admin下面的模塊,把其他admin下面的模塊都掛在index.js這個模塊上然后導(dǎo)出

var express = require('express')
var router = express.Router()
var course = require('./course')
var user = require('./user')

// 掛載user模塊
router.use('/', user)
// 掛載course模塊
router.use('/', course)

module.exports = router

第二步:在app.js中引入admin模塊

var adminRouter = require('./router/admin/index')

第三步:把adminRouter掛到app對象上

app.use('/admin', adminRouter)

第四步:需要注意师崎,user.js模塊中的請求路徑需要改變默终,例如:原來的"/admin/user/list"這種寫法,需要改成這種"/user/list"

最終的路由分級如下圖

image

#3.3.動態(tài)路由

動態(tài)路由就是路由是動態(tài)不固定的犁罩,例如:

http;//localhost:8090/user/1
http;//localhost:8090/user/2
http;//localhost:8090/user/3

上面的幾個url中齐蔽,都是去訪問某個user,前面部分(http;//localhost:8090/user)是相同的床估,不同的就是后面的部分

在后臺我們怎么去監(jiān)聽這種形式的url呢含滴?我們可以弄一個變量來匹配這些不同的部分,例如:

app.get('/user/:id', function (req, res) {
  console.log(req.params)
})

這其中的id就存儲了url中變化的部分

/user/1   id: 1
/user/2   id: 2
/user/3   id: 3

可以通過req.params.id打印出每次請求的動態(tài)部分(動態(tài)參數(shù))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丐巫,一起剝皮案震驚了整個濱河市谈况,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌递胧,老刑警劉巖碑韵,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缎脾,居然都是意外死亡祝闻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門遗菠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來联喘,“玉大人,你說我怎么就攤上這事辙纬』碓猓” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵贺拣,是天一觀的道長蓖谢。 經(jīng)常有香客問我捂蕴,道長,這世上最難降的妖魔是什么蜈抓? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任启绰,我火速辦了婚禮,結(jié)果婚禮上沟使,老公的妹妹穿的比我還像新娘委可。我一直安慰自己,他們只是感情好腊嗡,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布着倾。 她就那樣靜靜地躺著,像睡著了一般燕少。 火紅的嫁衣襯著肌膚如雪卡者。 梳的紋絲不亂的頭發(fā)上腰湾,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天脐湾,我揣著相機與錄音,去河邊找鬼颤枪。 笑死底挫,一個胖子當(dāng)著我的面吹牛恒傻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播建邓,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼盈厘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了官边?” 一聲冷哼從身側(cè)響起沸手,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎注簿,沒想到半個月后契吉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡诡渴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年栅隐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玩徊。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖谨究,靈堂內(nèi)的尸體忽然破棺而出恩袱,到底是詐尸還是另有隱情,我是刑警寧澤胶哲,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布畔塔,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏澈吨。R本人自食惡果不足惜把敢,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谅辣。 院中可真熱鬧修赞,春花似錦、人聲如沸桑阶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚣录。三九已至割择,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間萎河,已是汗流浹背荔泳。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留虐杯,地道東北人玛歌。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像厦幅,于是被迫代替她去往敵國和親沾鳄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容