NodeJS学习笔记之Connect中间件模块(一)_node.js

希望大家能够坚持看下去我这系列的文章,这也是对我的最大的鼓励与支持,让我们共同进步,以文会友,相互帮助。好了直接进入今天的主题,

什么是“Connect”,中间件又当如何理解,带着问题来看今天的文章。

如何理解 "中间件" ?

我的理解是这样的,中间件就是类似于一个过滤器的东西,在客户端和应用程序之间的一个处理请求和响应的的方法。

如果把一个http处理过程比作是污水处理,中间件就像是一层层的过滤网。每个中间件在http处理过程中通过改写request或(和)response的数据,

状态,实现了特定的功能。

什么是 ”Connect“ ?

我们可以把Connec看做一堆中间件的集合。对于每一次请求,Connect将会使用中间件层来过滤请求,其中每一个中间件都可以获取HTTP请求。

T.J Holowaychuk谈到Connect时,他说一共有两种类型的中间件。其中一种是过滤器:

过滤器处理请求,但是他们并不针对请求进行回应(想想服务器日志)。

第二种类型是供应器,它会针对请求进行回应,你可以根据你的需求使用多个中间件,Http请求将会通过每一个中间件直到其中一个中间件对请求进行回应。

二,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);

(2),原生实现方式与中间件实现之间的差异化。

(3),通过上述的几个中间件例子,理解用途和使用场景并且参考相关文档掌握其余中间件的基本使用。

时间: 2024-10-26 05:36:24

NodeJS学习笔记之Connect中间件模块(一)_node.js的相关文章

NodeJS学习笔记之Connect中间件应用实例_node.js

一,开篇分析 大家好哦,大熊君又来了,昨天因为有点个人的事没有写博客,今天又出来了一篇,这篇主要是写一个记事本的小应用,前面的文章, 我也介绍过"Connect"中间件的使用以及"Mongodb"的用法,今天就结合这两个中间件,写个实际的例子,不断完善和重构,已达到 充分学习的目的.好了,废话不说了,直接进入主题. 二,需求分析 (1),用户注册,登录功能(没有涉及很复杂的交互场景,注册时会有用户判断是否已存在). (2),用户登录成功,进入笔记管理系统的后台(笔记

NodeJS学习笔记之Connect中间件模块(二)_node.js

一,开篇分析 大家好,今天这篇文章主要是对"Connect"中间件以及相关辅助中间件,做一个源码分析系列,我想上一篇文章大家也看了, 介绍了使用方式及用途,而这篇也是出于本人的兴趣,让读者对其有一个更深入的认识,如在分析阶段有什么不正确的地方,请大家多多指教, 好了!老规矩然我们进入正题.先来看一个例子,结合会用引入分析,如下: 复制代码 代码如下:  var connect = require("./lib/connect") ;  var app = conne

Nodejs学习笔记之Global Objects全局对象_node.js

一,开篇分析 在上个章节中我们学习了NodeJS的基础理论知识,对于这些理论知识来说理解是至关重要的,在后续的章节中,我们会对照着官方文档逐步学习里面的各部分模块,好了该是本文主角登台亮相的时候了,Global 让我们来看一下官方的定义: Global Objects全局对象These objects are available in all modules. Some of these objects aren't actually in the global scope but in the

Nodejs学习笔记之入门篇_node.js

分享第一篇,关于 NodeJS -- Javascript 的常用知识以及如何从 Javascript 开发者过渡到 NodeJS 开发者(不会介绍具体的框架).在读本文前,希望你对 javascript 有一些初步的认识. Javascript 是一门原型模型的解释型语言.解释型将在后面的 NodeJS 里面讨论,原型链是 ES6 之前的 Javascript 的面向对象的实现方式之一,在 ES6 中支持的 class 增加了一种新的实现方式.在 Javascript 里面所有东西都是对象,包

node.js学习笔记(5) 模块

Node.js提供了一个简单的模块系统,可以让node.js的文件可以相互调用.模块是node.js应用程序的基本组成部分,文件与模块一一对应.也就是说一个文件就是一个模块,这些文件可以是javascript.json或者编译过的c/c++文件. 模块调用 有一个模块hello.js: exports.sayhello = function(name){ console.log('Hello, '+name +'.'); } 又有一个主模块main.js: var hello = require

轻松创建nodejs服务器(3):代码模块化_node.js

nodejs的功能块大都以模块的形式存在的. 通常会有一个统一入口index.js,然后调用不同的模块来完成我们需要的功能. 我们先来看看怎么把server.js变成一个模块让 index.js 主文件使用. 复制代码 代码如下: var http = require("http"); ... http.createServer(...); "http" 是nodejs自带的模块,我们在我们的代码中请求它并把返回值赋给一个本地变量. 我们可以用这个变量来调用 htt

NodeJS学习笔记之Http模块_node.js

一,开篇分析 首先"Http"这个概念大家应该比较熟悉了,它不是基于特定语言的,是一个通用的应用层协议,不同语言有不同的实现细节,但是万变不离其宗,思想是相同的, NodeJS作为一个宿主运行环境,以JavaScript为宿主语言,它也有自己实现的一套标准,这篇文章我们就一起来学习一下 "Http模块" .但是作为前提来说, 希望大家可以先阅读一下官网提供的api,有一个前置了解,这样就方便多了,以下是Http部分的api概览: 复制代码 代码如下: HTTP   

Nodejs学习笔记之NET模块_node.js

一,开篇分析 从今天开始,我们来深入具体的模块学习,这篇文章是这个系列文章的第三篇,前两篇主要是以理论为主,相信大家在前两篇的学习中, 对NodeJS也有一个基本的认识,没事!!!趁热打铁,让我们继续将NodeJS进行到底,好了废话不多说,直接进入今天的主题 "Net模块" ,那么"Net"应该如何理解那? 它是做什么用的那?(Net模块可用于创建Socket服务器或Socket客户端.NodeJS 的数据通信,最基础的两个模块是 Net 和 Http,前者是基于

Nodejs学习笔记之Stream模块_node.js

一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流是可读,可写或兼具两者的. 最早接触Stream是从早期的unix开始的, 数十年的实践证明Stream 思想可以很简单的开发出一些庞大的系统. 在unix里,Stream是通过 "|" 实现的.在node中,作为内置的stream模块,很多核心模块和三方模块都使用到. 和unix一样,node stream主要的操作也是.pipe(),使用者可以使