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


Posted in NodeJs onJanuary 27, 2015

希望大家能够坚持看下去我这系列的文章,这也是对我的最大的鼓励与支持,让我们共同进步,以文会友,相互帮助。好了直接进入今天的主题,

什么是“Connect”,中间件又当如何理解,带着问题来看今天的文章。

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

如何理解 "中间件" ?

我的理解是这样的,中间件就是类似于一个过滤器的东西,在客户端和应用程序之间的一个处理请求和响应的的方法。

如果把一个http处理过程比作是污水处理,中间件就像是一层层的过滤网。每个中间件在http处理过程中通过改写request或(和)response的数据,

状态,实现了特定的功能。

什么是 ”Connect“ ?

我们可以把Connec看做一堆中间件的集合。对于每一次请求,Connect将会使用中间件层来过滤请求,其中每一个中间件都可以获取HTTP请求。

T.J Holowaychuk谈到Connect时,他说一共有两种类型的中间件。其中一种是过滤器:

过滤器处理请求,但是他们并不针对请求进行回应(想想服务器日志)。

第二种类型是供应器,它会针对请求进行回应,你可以根据你的需求使用多个中间件,Http请求将会通过每一个中间件直到其中一个中间件对请求进行回应。

二,Connect内置中间件介绍

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

下面列举出几个主要的中间件,并且实例讲述:

(1),cookieParser------cookie解析中间件,解析Cookies的头通过req.cookies得到cookies。还可以通过req.secret加密cookies。

var connect = require('./lib/connect') ;

var app = connect()

.use(connect.cookieParser('secret string'))

.use(function (req,res,next){

    req.cookies.website="hi,i am bigbear !" ;

    res.end(JSON.stringify(req.cookies)) ;

}).listen(8888) ;

(2),session

描述:会话管理中间件

依赖:cookieParser

参数:options

options:

key:Cookies名,默认值为connect.sid

store: session存储实例

secret: session的cookie加密

cookie: session的cookie配置,默认值为{path: ‘/', httpOnly: true, maxAge: null}

proxy:安全cookie的反向代理,通过x-forwarded-proto实现

Cookie option:

cookie.maxAge: 默认值null,表示当浏览器关闭后cookie被删除。

 var connect = require('./lib/connect');

 var app = connect()

 .use(connect.logger('dev'))

 .use(connect.cookieParser())

 .use(connect.session({secret: '123', cookie: { maxAge: 60000 }}))

 .use(function (req, res, next) {

     if(req.session.pv){

         res.setHeader('Content-Type', 'text/html');

         res.write('views: ' + req.session.pv);

         res.end();

         req.session.pv++;

     }else{

         req.session.pv = 1;

         res.end('Refresh');

     }

 })

 .listen(8888);

随着客户端不断刷新页面 "PV" 会不断增加,服务器端 “Session” 维护数量 。

(3),bodyParser------请求内容解析中间件,支持多种类型application/json,application/x-www-form-urlencoded, multipart/form-data。

 var connect = require('connect');

 var app = connect()

     .use(connect.bodyParser())

     .use(function(req, res) {

         res.end('req.body=>' + JSON.stringify(req.body));

     })

 .listen(8888);

 三,再来个对比实例,看看使用中间件的好处。

 /*

  * 使用connect实现的静态文件处理

  */

 var connect = require('connect');

 connect(connect.static(__dirname + '/public')).listen(//监听

     8888,

     function() {

         console.log('Connect started on port 8888');

     }

 );

 /*

  * 使用node原生api实现

  */

 var http = require('http');

 http.createServer(

     function(req, res) {

         var url = require('url');

         var fs = require('fs');

         var pathname = __dirname + '/public' + url.parse(req.url).pathname;

         //读取本地文件

         fs.readFile(

             pathname,

             function(err, data) {

                 //异常处理

                 if (err) {

                     res.writeHead(500);

                     res.end('500');

                 }

                 else {

                     res.end(data);

                 }

             }

         );

     }

 ).listen(//监听

     8888,

     function() {

         console.log('Http Server started on port 8888');

     }

 );

尽管node原生api已经花费这么些行代码,但其实仍然留下一个简单静态文件服务器的诸多方面未经处理,

比如:404等异常未处理、没有基本的文件路径安全验证(实际上我们可以访问到整个os文件系统)、全局异常处理等等;

与此同时connect已经将这些问题都处理好了。

四,总结一下

 (1),理解中间件流式处理。

 var app = connect();

 app.use(connect.staticCache());

 app.use(connect.static(__dirname + '/public'));

 app.use(connect.cookieParser());

 app.use(connect.session());

 app.use(connect.query());

 app.use(connect.bodyParser());

 app.use(connect.csrf());

 app.use(function (req, res, next) {

   // 中间件

 });

 app.listen(8888);

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

(2),原生实现方式与中间件实现之间的差异化。

(3),通过上述的几个中间件例子,理解用途和使用场景并且参考相关文档掌握其余中间件的基本使用。

NodeJs 相关文章推荐
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
Highcharts+NodeJS搭建数据可视化平台示例
Jan 01 NodeJs
nodejs+websocket实时聊天系统改进版
May 18 NodeJs
详解Nodejs之静态资源处理
Jun 05 NodeJs
nodejs开发微信小程序实现密码加密
Jul 11 NodeJs
nodejs密码加密中生成随机数的实例代码
Jul 17 NodeJs
使用Nodejs连接mongodb数据库的实现代码
Aug 21 NodeJs
windows系统下更新nodejs版本的方案
Nov 24 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
Nodejs中的require函数的具体使用方法
Apr 02 NodeJs
如何利用nodejs实现命令行游戏
Nov 24 NodeJs
nodejs批量修改文件编码格式
Jan 22 #NodeJs
NodeJS学习笔记之MongoDB模块
Jan 13 #NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 #NodeJs
NodeJS学习笔记之FS文件模块
Jan 13 #NodeJs
NodeJS学习笔记之Http模块
Jan 13 #NodeJs
Nodejs学习笔记之Stream模块
Jan 13 #NodeJs
Nodejs学习笔记之NET模块
Jan 13 #NodeJs
You might like
域名和cookie问题(域名后缀)
2012/10/10 PHP
php 模拟get_headers函数的代码示例
2013/04/27 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
2019/03/22 PHP
php和asp语法上的区别总结
2019/05/12 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
学习JavaScript的最佳方法分享
2011/10/21 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
flag和jq on 的绑定多个对象和方法(必看)
2017/02/27 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
vue2 前端搜索实现示例
2018/02/26 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
VUE中使用HTTP库Axios方法详解
2020/02/05 Javascript
[06:53]2018DOTA2国际邀请赛寻真——为复仇而来的Newbee
2018/08/15 DOTA
Python translator使用实例
2008/09/06 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
PyTorch基本数据类型(一)
2019/05/22 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
Molton Brown美国官网:奢华美容、香水、沐浴和身体护理
2020/09/02 全球购物
缴纳养老保险的证明
2014/01/10 职场文书
幼儿园六一儿童节文艺汇演主持词
2014/03/21 职场文书
我的大学生活演讲稿
2014/04/25 职场文书
法制宣传口号
2014/06/16 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
2014年质检工作总结
2014/11/26 职场文书
2016年春季趣味运动会开幕词
2016/03/04 职场文书
Python函数式编程中itertools模块详解
2021/09/15 Python