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访问ActiveX对象,以操作Access数据库为例。
Dec 15 NodeJs
nodejs入门详解(多篇文章结合)
Mar 07 NodeJs
将nodejs打包工具整合到鼠标右键的方法
May 11 NodeJs
基于NodeJS的前后端分离的思考与实践(二)模版探索
Sep 26 NodeJs
进阶之初探nodeJS
Jan 24 NodeJs
深入理解nodejs中Express的中间件
May 19 NodeJs
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
Sep 18 NodeJs
详解从NodeJS搭建中间层再谈前后端分离
Nov 13 NodeJs
nodejs中request库使用HTTPS代理的方法
Apr 30 NodeJs
Nodejs实现图片上传、压缩预览、定时删除功能
Oct 25 NodeJs
nodejs如何在package.json中设置多条启动命令
Mar 16 NodeJs
在NodeJs中使用node-schedule增加定时器任务的方法
Jun 08 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
set_include_path在win和linux下的区别
2008/01/10 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
使用PHP实现下载CSS文件中的图片
2015/12/06 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
JS实现的3D拖拽翻页效果代码
2015/10/31 Javascript
Easyui form combobox省市区三级联动
2016/01/13 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
Node连接mysql数据库方法介绍
2017/02/07 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
el-select数据过多懒加载的解决(loadmore)
2019/05/29 Javascript
js实现简单的秒表
2020/01/16 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
JavaScript实现雪花飘落效果
2020/12/27 Javascript
详细介绍Python中的偏函数
2015/04/27 Python
Python实现新浪博客备份的方法
2016/04/27 Python
python 剪切移动文件的实现代码
2018/08/02 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
Opencv常见图像格式Data Type及代码实例
2020/11/02 Python
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
使用canvas压缩图片上传的方法示例
2020/02/07 HTML / CSS
匡威德国官网:Converse德国
2019/01/26 全球购物
设计部经理的岗位职责
2013/11/16 职场文书
水果超市创业计划书
2014/01/27 职场文书
个人承诺书
2014/03/26 职场文书
学术诚信承诺书
2014/05/26 职场文书
给老婆的保证书怎么写
2015/05/08 职场文书
教学质量月活动总结
2015/05/11 职场文书
丧事答谢词大全
2015/09/30 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python