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服务器(3):代码模块化
Dec 18 NodeJs
NodeJS整合银联网关支付(DEMO)
Nov 09 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
nodejs实现简单的gulp打包
Dec 21 NodeJs
NodeJs之word文件生成与解析的实现代码
Apr 01 NodeJs
nodejs通过钉钉群机器人推送消息的实现代码
May 05 NodeJs
NodeJS读取分析Nginx错误日志的方法
May 14 NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
nodeJs项目在阿里云的简单部署
Nov 27 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
yii框架配置默认controller和action示例
2014/04/30 PHP
PHP基于php_imagick_st-Q8.dll实现JPG合成GIF图片的方法
2014/07/11 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
PHP7 echo和print语句实例用法
2019/02/15 PHP
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
jquery实现倒计时效果
2015/12/14 Javascript
jQuery视差滚动效果网页实现方法经验总结
2016/09/29 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
用纯Node.JS弹出Windows系统消息提示框实例(MessageBox)
2017/05/17 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
Parcel.js + Vue 2.x 极速零配置打包体验教程
2017/12/24 Javascript
React props和state属性的具体使用方法
2018/04/12 Javascript
利用vscode调试编译后的js代码详解
2018/05/14 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
这应该是最详细的响应式系统讲解了
2019/07/22 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
使用Python设计一个代码统计工具
2018/04/04 Python
Python实现的凯撒密码算法示例
2018/04/12 Python
Python OpenCV利用笔记本摄像头实现人脸检测
2020/08/20 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
详解python中*号的用法
2019/10/21 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
Trench London官方网站:高级风衣和意大利皮夹克
2020/07/11 全球购物
成龙洗发水广告词
2014/03/14 职场文书
爱耳日活动总结
2014/04/30 职场文书
校园安全标语
2014/06/07 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
小学英语复习计划
2015/01/19 职场文书
2016年十一促销广告语
2016/01/28 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
Laravel中获取IP的真实地理位置
2021/04/01 PHP
MySQL性能压力基准测试工具sysbench的使用简介
2021/04/21 MySQL