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打包工具整合到鼠标右键的方法
May 11 NodeJs
Nodejs学习笔记之Global Objects全局对象
Jan 13 NodeJs
浅析nodejs实现Websocket的数据接收与发送
Nov 19 NodeJs
浅谈Nodejs应用主文件index.js
Aug 28 NodeJs
nodejs redis 发布订阅机制封装实现方法及实例代码
Dec 15 NodeJs
详解NodeJs支付宝移动支付签名及验签
Jan 06 NodeJs
详解nodejs微信公众号开发——1.接入微信公众号
Apr 10 NodeJs
nodejs 图解express+supervisor+ejs的用法(推荐)
Sep 08 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
nodejs读取并去重excel文件
Apr 22 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
Nodejs + Websocket 指定发送及群聊的实现
Jan 09 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
基于mysql的bbs设计(一)
2006/10/09 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
2015/12/17 PHP
javascript 动态数据下的锚点错位问题解决方法
2008/12/24 Javascript
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
javaScript arguments 对象使用介绍
2013/10/18 Javascript
jquery如何判断某元素是否具备指定的样式
2013/11/05 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
JavaScript实现左右下拉框动态增删示例
2017/03/09 Javascript
vue-star评星组件开发实例
2018/03/01 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
JQuery通过后台获取数据遍历到前台的方法
2018/08/13 jQuery
vue 进阶之实现父子组件间的传值
2019/04/26 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
React+Redux实现简单的待办事项列表ToDoList
2019/09/29 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
[42:20]2014 DOTA2华西杯精英邀请赛5 24 DK VS NewBee
2014/05/25 DOTA
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
[57:47]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
python操作excel的方法(xlsxwriter包的使用)
2018/06/11 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
Python txt文件如何转换成字典
2020/11/03 Python
GANT葡萄牙官方商店:拥有美国运动服传统的生活方式品牌
2018/10/18 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
什么是唯一索引
2015/07/05 面试题
机电一体化专业应届生求职信
2013/11/27 职场文书
基督教婚礼主持词
2014/03/14 职场文书
关于安全演讲稿
2014/05/09 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
音乐之声观后感
2015/06/04 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS