3.路由
路由到底是什么呢火本?不管官方定義到底是什么逗宜,咱通俗的說就是根據(jù)不同的url,執(zhí)行不同的代碼叹话,類似于編程語言中的分支結(jié)構(gòu)
#3.1.express規(guī)劃路由
稍微復(fù)雜點的應(yīng)用朝墩,通常都是分模塊進行的醉拓,例如:
我們從中挑選幾個模塊進行路由規(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
第二步双藕,在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)該是這樣的:
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"
最終的路由分級如下圖
#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ù))