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 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
基于promise.js实现nodejs的promises库
Jul 06 NodeJs
NodeJS中的MongoDB快速入门详细教程
Nov 11 NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 NodeJs
深入nodejs中流(stream)的理解
Mar 27 NodeJs
详解nodejs通过响应回写的方式渲染页面资源
Apr 07 NodeJs
nodejs实现套接字服务功能详解
Jun 21 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 NodeJs
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
Nov 18 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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
深入phpMyAdmin的安装与配置的详细步骤
2013/05/07 PHP
php实现批量压缩图片文件大小的脚本
2014/07/04 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
jQuery插件Tmpl的简单使用方法
2015/04/27 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
2016/06/08 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
jquery学习笔记之无new构建详解
2017/12/07 jQuery
详解VUE-地区选择器(V-Distpicker)组件使用心得
2018/05/07 Javascript
vue 监听屏幕高度的实例
2018/09/05 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
深入了解JS之作用域和闭包
2020/06/16 Javascript
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
Python实现网络端口转发和重定向的方法
2016/09/19 Python
Python实现的径向基(RBF)神经网络示例
2018/02/06 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
python自带tkinter库实现棋盘覆盖图形界面
2019/07/17 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
pip已经安装好第三方库但pycharm中import时还是标红的解决方案
2020/10/09 Python
HTML5 贪吃蛇游戏实现思路及源代码
2013/09/03 HTML / CSS
华硕新加坡官方网上商店:ASUS Singapore
2020/07/09 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
保护环境倡议书范文
2014/05/13 职场文书
办公室主任岗位职责
2015/01/31 职场文书
用javascript制作qq注册动态页面
2021/04/14 Javascript
python基础之模块的导入
2021/10/24 Python
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS
box-shadow单边阴影的实现
2023/05/21 HTML / CSS