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中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
Nodejs为什么选择javascript为载体语言
Jan 13 NodeJs
nodejs批量修改文件编码格式
Jan 22 NodeJs
你一定会收藏的Nodejs代码片段
Feb 04 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
nodejs的HTML分析利器node-jquery用法浅析
Nov 08 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
NodeJS实现自定义流的方法
Aug 01 NodeJs
nodejs实现一个word文档解析器思路详解
Aug 14 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
php metaphone()函数的定义和用法
2016/05/15 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
JavaScript的Cookies
2008/01/16 Javascript
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
javascript 验证日期的函数
2010/03/18 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
js判断iframe内的网页是否滚动到底部触发事件
2014/03/18 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
JS实现躲避粒子小游戏
2020/06/18 Javascript
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
2018/12/07 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
python 抓包保存为pcap文件并解析的实例
2019/07/23 Python
python实现邮件自动发送
2019/08/10 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
Python实现迪杰斯特拉算法过程解析
2020/09/18 Python
Python 随机按键模拟2小时
2020/12/30 Python
全球最大的瓷器、水晶和银器零售商:Replacements
2020/06/15 全球购物
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
毕业学生推荐信
2013/12/01 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
《最大的“书”》教学反思
2014/02/14 职场文书
基督教婚礼主持词
2014/03/14 职场文书
课堂教学改革实施方案
2014/03/17 职场文书
Python基础之数据结构详解
2021/04/28 Python
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS