在代码中,中间件和路由的位置顺序非常重要。一个request请求到来时,它们会按照代码中的先后顺序依次执行。这就意味着如果你把中间件写在某一个路由的后面,路由会拦截这个request请求并完成响应,中间件则永远不会被执行。
带参数的路由 /hello/:name
我们想要在URL中传递一个人的名字name,让NODE应用输出 Hello name! 这里可以使用带参数的路由。
// server.js ... // 获取router实例 var router = express.Router(); ... // 带参数的路由 (:8080/hello/:name) router.get('/hello/:name', function(req, res) { res.send('hello ' + req.params.name + '!'); }); // 把定义好的路由集成到Node应用中 app.use('https://www.jb51.net/', router); ...
现在我们访问:8080/hello/holly就可以看到浏览器页面展示的信息:
Hello holly!
创建参数中间件
如果想要校验上面传入URL的人的名字,确保名字是符合规范的,我们需要在路由中间件中去校验URL中的参数name。它有个特殊的名字,参数中间件。我们可以使用express.param()去创建它。
// server.js ... // 获取router实例 var router = express.Router(); ... // 参数中间件 校验name参数 router.param('name', function(req, res, next, name) { // 在这里进行校验操作 console.log('doing name validations on ' + name); // 校验通过我们把校验后的名字赋值给req对象 req.name = name; // 继续处理request请求,寻找匹配的路由 next(); }); // 带参数的路由 (:8080/hello/:name) router.get('/hello/:name', function(req, res) { res.send('hello ' + req.name + '!'); }); // 把定义好的路由集成到Node应用中 app.use('https://www.jb51.net/', router);
现在当我们访问到/hello/:name路由,我们编写的参数中间件就会介入并做相应的校验处理。校验通过我们把校验后的名字赋值给req对象,并在相应的.get路由中使用req.name获取校验后的名字。打开浏览器,访问:8080/hello/sally,我们可以看到浏览器展示的信息:
Hello sally!
console控制台打印出:
doing name validations on sally
如果你使用RESTful API,你甚至可以校验token是否有效,来判断用户是否有权限访问。
链式路由
我们也可以直接在app对象上创建路由。利用app.route()可以针对一个路由定义多个路由处理函数。例如,对/login路由发起get请求,展示登录界面,同时也可以对/login路由发起post请求,提交登录表单信息。我们就可以使用app.route来创建这个/login路由。
// ROUTES // ============================================== app.route('/login') // 展示登录界面 (GET :8080/login) .get(function(req, res) { res.send('this is the login form'); }) // 提交登录表单 (POST :8080/login) .post(function(req, res) { console.log('processing'); res.send('processing the login form!'); }); ...
总结
使用Express 4.0中的路由,我们可以更灵活的定义路由:
多次使用express.Router()定义一组路由
使用express.Router()划分模块,并用app.use()把他们整合起来
使用路由中间件对request请求进行预处理
使用参数中间.param()件对URL中参数进行校验
使用app.route()创建链式路由