《Pro Express.js》学习笔记——app.params中间件
app.param中间件用于对URL中的参数进行获取、加工、输出,提供公有逻辑,以达到代码重构的目的。
以下示例采取三个步骤对代码进行重构,app.param中间件的作用非常明显:
- 不使用中间件
- 使用自定义中间件
- 使用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);
});
});
使用自定义中间件

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中间件

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);
});
小结
- app.param中间件起到AOP的作用,对含有指定参数的请求进行统一拦截处理,便于集中维护管理;
- app.param中间件简化了后面路由处理时的写法,无须再次显式调用中间件来处理,更简约。
《Pro Express.js》学习笔记——app.params中间件的更多相关文章
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- 【转】Backbone.js学习笔记(二)细说MVC
文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Bac ...
- 系列文章--Node.js学习笔记系列
Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- 简介及安装Node.js开发环境 Nodejs学习笔记(二)--- 事件模块 Nodejs学习笔记(三)--- 模块 Nodejs学 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- NodeJS学习笔记之Connect中间件模块(一)
NodeJS学习笔记之Connect中间件模块(一) http://www.jb51.net/article/60430.htm NodeJS学习笔记之Connect中间件模块(二) http://w ...
- JS 学习笔记--9---变量-作用域-内存相关
JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...
- WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)
WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...
- WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法
WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...
- WebGL three.js学习笔记 创建three.js代码的基本框架
WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...
随机推荐
- http websocket
套接字 http 协议 tcp/ip协议 服务器端口 网络协议 http://wenku.it168.com/d_001406013.shtml 跨源 AJAX 事件驱动 http://www.lin ...
- 基于Web的制造追溯系统DEMO
写在前面 本文不贴任何代码,以图片为主,也许图片更直观,请各位园友谅解! 很久没有写过博客了,这是2016年的第一篇文章:最近主要是忙着完成公司的一个新项目,逛园子的时间都明显少了,只有下班回到家睡觉 ...
- AngularJS小知识点一
AngularJS是由谷歌公司及一个由开发者组成的个人社区共同打造.其主要优势在于帮助使用者在web应用程序中实现必要的动态视图.它是通过原生的MVC(模型-视图-控制器)功能来增强HTML. PS: ...
- Redis教程(一):Redis简介
转自:http://www.jb51.net/article/65240.htm 一.简介: 在过去的几年中,NoSQL数据库一度成为高并发.海量数据存储解决方案的代名词,与之相应的产品也呈现出雨后春 ...
- commons-io ProxyInputStream,ProxyOutputStream,ProxyReader,ProxyWriter
1.ProxyInputStream: A Proxy stream which acts as expected, that is it passes the method calls on to ...
- 转!! PreparedStatement是如何防止SQL注入的
SQL注入最简单也是最常见的例子就是用户登陆这一模块,如果用户对SQL有一定的了解,同时系统并没有做防止SQL注入处理,用户可以在输入的时候加上'两个冒号作为特殊字符,这样的话会让计算机认为他输入的是 ...
- 完美解释if-modified-since/not-modified 文件头的意义
http://www.cnblogs.com/zh2000g/archive/2010/03/22/1692002.html 很好很强大
- JS在window和document的应用
页面跳转: window.location.href('地址') window.open('地址', '_self') 打开新窗口: window.open('地址', '_blank') 只显示地址 ...
- unity平台的预处理
unity平台的预处理 在开发中,特别是unity的跨平台中,我们经常会在各个平台游走,如安卓版,苹果版,PC版.......在此不同的平台上,有可能我们需要做不同的操作.然而我们就可以用un ...
- 深入springMVC------文件上传源码解析(上篇)
最近在项目中,使用springmvc 进行上传文件时,出现了一个问题: org.springframework.web.multipart.MultipartException: The curren ...