目錄
一、前言
上一篇文章我們講了express路由模塊的封裝,以及複習了npm init -y初始化項目、express的安裝等知識點。詳見可參考博文:Node.js後端開發 - 進階篇 #8 express框架之路由模塊的封裝1 上篇文章對express路由模塊的封裝是我們直接可以想到的思維方式,雖然這麼寫可以實現功能,但是express並不推薦這麼寫,不太安全。這篇文章我們將基於上篇路由模塊的封裝代碼進行修改
二、路由模塊的封裝2(相對安全)
模型圖思路參考
項目初始化和express安裝使用這裏就不說了,可見上一篇文章。首先我們看一個模型圖
1、首先在 router.js 裏面創建一個路由對象,
2、用 router 對象去設置一些路由,如:get、post等,設置完成以後把 router 對象返回給 app.js
3、在 app.js裏面就能拿到這個 router 對象了,
4、把這個設置好的 router 對象通過 use 函數與 app 對象相關聯
5、相關聯以後,router.js 裏面的路由就都能啓作用了
這種做法就不需要我們把 app 對象傳遞給 router.js,下面我們直接開始正式代碼( 已經有詳細註釋,就不多說了 )
步驟1:寫主模塊app.js
// app.js 模塊職責:負責啓動服務
//1. 加載 express 模塊
var express = require('express');
//加載 config.js 模塊
var config = require('./config.js');
//加載路由模塊
var router = require('./router.js');
//2. 創建 app 對象
var app = express();
// 這個router,它既是一個對象也是一個函數
// 這個函數,它也是一箇中間件
// 我們可以打印看看:
console.log(router.toString());
// 看源碼,
// function router(req, res, next) {
// router.handle(req, res, next);
// }
//它是一個函數,裏面調用了router的handle方法
//3. 啓動路由
// 設置 app 和 router 相關聯
// 這個router,它既是一個對象也是一個函數
// 這個函數,它也是一箇中間件
app.use('/', router);
//4. 啓動服務
app.listen(config.port, function () {
console.log('http://localhost:'+config.port);
});
步驟2:寫配置模塊 config.js
// 配置模塊: 主要職責是負責保存項目中的配置信息
module.exports = {
port : 3000
};
步驟3:寫路由模塊 router.js
//路由模塊:主要負責路由判斷
//1. 創建一個 router 對象(router 對象既是一個對象,也是一個函數)
var express = require('express');
var router = express.Router();
//2. 通過 router 對象設置(掛載)路由
router.get('/', function (req, res) {
console.log("當前根目錄");
});
router.get('/index', function (req, res) {
console.log("index");
});
//3. 返回 router 對象
module.exports = router;
三、路由代碼思路分析總結
// 當我們運行路由代碼,如代碼
router.get('/', function (req, res) {
console.log("根目錄");
});
router.get('/index', function (req, res) {
console.log("index");
});
// 這兩個路由的請求並沒有發生,它只是配置設置好了路由。其實我們在這裏設置路由的含義是:
// 內部它會幫我們生成保存一個路由表,這個路由表是以鍵值對的形式存在。
// 如:我們可以把請求方法(get)和請求路徑('/') 看作爲鍵,
// 把執行的回調函數 function (req, res) { } 看作爲值。
// 然後 router 設置掛載完以後,我們暴露返回 router 對象 module.exports = router;
// 然後我們在 app.js 裏面,加載路由模塊。var router = require('./router.js');
// 拿到 router 對象,它裏面就是一個路由表,路由表裏面是一堆鍵值對形式的路由。
// 然後通過 app.use('/', router); 關聯app對象,把 router 對象的路由表設置給 app 對象
// 另外需要注意:
app.use('/', router);
app.use(router);
// 它們是等價的。下面兩個函數的寫法也是等價的
app.use('/', function (params) {
});
app.use(function (params) {
);
// 也就是說第一個參數不傳,它會自動默認傳根目錄路徑。
// 有興趣的朋友可以去看看源碼,express 的源碼都在這個 node_modules/express/lib 下面。