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教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
nodejs开发环境配置与使用
Nov 17 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
nodejs实现邮件发送服务实例分享
Mar 29 NodeJs
nodejs入门教程三:调用内部和外部方法示例
Apr 24 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
基于Nodejs的Tcp封包和解包的理解
Sep 19 NodeJs
nodejs异步编程基础之回调函数用法分析
Dec 26 NodeJs
用Electron写个带界面的nodejs爬虫的实现方法
Jan 29 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 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
apache+php+mysql安装配置方法小结
2010/08/01 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
php 记录进行累加并显示总时长为秒的结果
2011/11/04 PHP
PHP实现利用MySQL保存session的方法
2014/08/23 PHP
php隐藏实际地址的文件下载方法
2015/04/18 PHP
PHP简单判断手机设备的方法
2016/08/23 PHP
php根据年月获取当月天数及日期数组的方法
2016/11/30 PHP
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
js常用排序实现代码
2010/12/28 Javascript
jQuery的运行机制和设计理念分析
2011/04/05 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
bootstrap表单示例代码分享
2017/05/18 Javascript
浅谈React Native Flexbox布局(小结)
2018/01/08 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
vue Element左侧无限级菜单实现
2020/06/10 Javascript
JS代码实现页面切换效果
2021/01/10 Javascript
[01:01:23]完美世界DOTA2联赛PWL S2 Forest vs FTD.C 第一场 11.26
2020/11/30 DOTA
python基础教程之udp端口扫描
2014/02/10 Python
Python 循环语句之 while,for语句详解
2018/04/23 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
基于Python爬取爱奇艺资源过程解析
2020/03/02 Python
Python pymsql模块的使用
2020/09/07 Python
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
高中毕业自我鉴定范文
2013/10/02 职场文书
浙江文明网签名寄语
2014/01/18 职场文书
企业军训感言
2014/02/08 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
四年级作文之植物
2019/09/20 职场文书
tomcat的catalina.out日志按自定义时间格式进行分割的操作方法
2022/04/02 Servers