目录
一、前言
上一篇文章我们讲了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 下面。