概述
在使用 Express 框架 做项目时,如果将所有的路由都写到一个js文件里(如app.js),随着项目越来越复杂,这个文件将越来越难维护。实际上在做大型项目时,通常会按业务功能模块分离出不同的路由模块。
路由分离项目框架
下面是通过 express-generator 应用生成器工具生成的 Web应用,该项目将路由分模块放到了routes路径下。
说明:
node_modules:存放package.json中配置的模块;
public:存放image,css,js文件;
routes:存放路由文件;
views:存放模板文件;
app.js:启动文件,Web应用入口;
package.json:存放模块依赖,当使用命令 npm install 的时候,会自动检查package下配置的模块,并把模块安装到node_modules中
express.Router() 介绍
从Express 4.0开始,顶层的express对象有一个Router()方法,可以使用Router()来创建一个新的router对象,router可以当做小型的express应用程序一样,可以在其上添加中间件和HTTP动词方法(如get,put,post等)
var express = require("express");
var app = express(); // 创建一个应用实例
var router1 = express.Router(); // 创建router1路由实例
var router2 = express.Router(); // 创建router2路由实例
// router.all(path, [callback, ...] callback) 方法会匹配当前router所有的HTTP动作
// path默认为 *,如果指定则仅作用于指定的path对应的HTTP动作,如下仅为当前router下 /user 开头的路由对应的HTTP方法 加载 express.json() 中间件
router1.all('/user/*', express.json());
// router.param(name, callback) ,给路由参数添加回调触发器,用于路径参数的处理
// callback回调方法的参数按序是请求对象,响应对象,下个中间件,参数名
// 不像 app.param(),router.param()不接受一个数组作为路由参数
router1.param('userid',function (req,res,next,id){
req.userid = id;
next();
});
// router.METHOD(path, [callback, ...] callback) 用法同 app.METHOD()
router1.get('/user/demo', (req, res) => res.send(req.method+' '+req.originalUrl+' '+req.userid)); // req.userid = undefined,因为仅当路由包含 router.param(name,callback) 中的name时,才会触发callback
router1.post('/user/:userid', (req, res) => res.