app.param中间件用于对URL中的参数进行获取、加工、输出,提供公有逻辑,以达到代码重构的目的。

以下示例采取三个步骤对代码进行重构,app.param中间件的作用非常明显:

  1. 不使用中间件
  2. 使用自定义中间件
  3. 使用app.param中间件

不使用中间件

 1 var users = {
 2     'azat': {
 3         email: 'hi@azat.co',
 4         website: 'http://azat.co',
 5         blog: 'http://webapplog.com'
 6     }
 7 };
 8 
 9 var findUserByUsername = function (username, callback) {
     if (!users[username]) {
         return callback(new Error('No user matching ' + username));
     }
 
     return callback(null, users[username]);
 }
 
 app.get('/v1/users/:username', function (request, response, next) {
     var username = request.params.username;
     findUserByUsername(username, function (error, user) {
         if (error) return next(error);
         return response.render('user', user);
     });
 });
 
 app.get('/v1/admin/:username', function (request, response, next) {
     var username = request.params.username;
     findUserByUsername(username, function (error, user) {
         if (error)return next(error);
         return response.render('admin', user);
     });
 });

使用自定义中间件

 1 var findUserByUsernameMiddleware = function (request, response, next) {
 2     if (request.params.username) {
 3         console.log('Username param was detected: ' + request.params.username);
 4         findUserByUsername(request.params.username, function (error, user) {
 5             if (error)return next(error);
 6             request.user = user;
 7             return next();
 8         })
 9     } else {
         return next();
     }
 }
 
 app.get('/v2/users/:username',
     findUserByUsernameMiddleware,
     function (request, response, next) {
         return response.render('user', request.user);
     });
 
 app.get('/v2/admin/:username',
     findUserByUsernameMiddleware,
     function (request, response, next) {
         return response.render('admin', request.user);
     });

使用app.param中间件

 1 app.param('v3Username',function(request,response,next,username){
 2     console.log('Username param was detected: '+username);
 3     findUserByUsername(username,function(error,user){
 4         if (error)return next(error);
 5         request.user = user;
 6         return next();
 7     });
 8 });
 9 
 app.get('/v3/users/:v3Username',
     function (request, response, next) {
         return response.render('user', request.user);
     });
 
 app.get('/v3/admin/:v3Username',
     function (request, response, next) {
         return response.render('admin', request.user);
     });

小结

  1. app.param中间件起到AOP的作用,对含有指定参数的请求进行统一拦截处理,便于集中维护管理;
  2. app.param中间件简化了后面路由处理时的写法,无须再次显式调用中间件来处理,更简约。

源码地址

《Pro Express.js》学习笔记——app.params中间件的更多相关文章

  1. Vue.js学习笔记(2)vue-router

    vue中vue-router的使用:

  2. 【转】Backbone.js学习笔记(二)细说MVC

    文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Bac ...

  3. 系列文章--Node.js学习笔记系列

    Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...

  4. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  5. NodeJS学习笔记之Connect中间件模块(一)

    NodeJS学习笔记之Connect中间件模块(一) http://www.jb51.net/article/60430.htm NodeJS学习笔记之Connect中间件模块(二) http://w ...

  6. JS 学习笔记--9---变量-作用域-内存相关

    JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...

  7. WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)

    WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...

  8. WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法

    WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...

  9. WebGL three.js学习笔记 创建three.js代码的基本框架

    WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...

随机推荐

  1. 安卓解析json,使用BaseAdapter添加至ListView中,中间存储用JavaBean来实现

    这是一个小练习,要求解析一个提供的json文件.并将其中的id,title值获取,以ListView形式展示出来.(开发工具是android studio) 下面开始: 首先我想到的是先把json文件 ...

  2. SYSTick 定时器

        CM3 内核的处理器,内部包含了一个 SysTick 定时器,(SysTick 的时钟源自 HCLK 的 8 分频,8个系统时钟周期systick跳一个,即8*1/72M=1/9 us)Sys ...

  3. 相机位姿估计1_1:OpenCV:solvePnP二次封装与性能测试

    关键词:OpenCV::solvePnP 文章类型:方法封装.测试 @Author:VShawn(singlex@foxmail.com) @Date:2016-11-27 @Lab: CvLab20 ...

  4. 谈谈Memcached与Redis

    1. Memcached简介 Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器.其本质上就是一个 ...

  5. mysql事务处理

    事务处理能保证所有的sql操作一次性完成或回滚,mysql默认的MyISAM表类型是不支持事务处理的,如果需要做事务处理,需要把表类型换成InnoDB <?php $dsn='mysql:hos ...

  6. webpack + react + es6, 并附上自己碰到的一些问题

    最近一直在学react,react的基础部分已经学得差不多了,然而自己并没有做详细的记录,有兴趣的同志可以参考阮一峰老师的教程,个人觉得挺不错的,链接如下:https://github.com/rua ...

  7. raw转qcow2

    raw转qcow2命令 : qemu-img convert -f raw test.img -O qcow2 test.img.qcow2 转晚之后,还需要virsh edit test,修改里面的 ...

  8. 无法删除对象 '产品',因为该对象正由一个 FOREIGN KEY 约束引用。

    在删除northwindcs表时,发生报错,消息 3726,级别 16,状态 1,第 2 行,无法删除对象 '产品',因为该对象正由一个 FOREIGN KEY 约束引用.此时判断是因为有其他表的外键 ...

  9. java对国际化的支持

    国际化的英文为Internationalization,这个也太长了,所以它又称为I18n(英文单词 internationalization的首末字符i和n,18为中间的字符数). 除了i18n还有 ...

  10. Android应用中MVP开发模式

    所谓MVP(Model-View-Presenter)模式.是将APP的结构分为三层: view - UI显示层 view 层主要负责: 提供UI交互 在presenter的控制下修改UI. 将业务事 ...