NodeJS学习笔记之Connect中间件模块

作者: 韦德国际1946国际网址  发布:2019-07-23

一,开篇剖析

希望大家可以坚定不移看下去笔者那系列的稿子,那也是对自己的最大的鼓励与支持,让我们共同升高,以文种友,相互扶持。好了一贯进去年今年日的核心,

NodeJS学习笔记之Connect中间件模块(二),nodejs学习笔记

一,开篇深入分析

大家好,今日那篇小说首倘若对"Connect"中间件以及相关赞助中间件,做叁个源码分析体系,小编想上一篇文章大家也看了,

介绍了利用办法及用途,而那篇也是由于自己的乐趣,让读者对其有多少个更深切的认知,如在深入分析阶段有哪些不准确的地点,请大家多多指教,

好了!老规矩然我们进去正题。先来看一个例证,结合会用引进解析,如下:

复制代码 代码如下:

 var connect = require("./lib/connect") ;
 var app = connect.createServer() ;
 app.use(connect.static(__dirname "/public",{
    maxAge: 0 
})) ;
 app.use(function(req,res,next){
     res.end("Hello World !") ;
 })
 .listen(8888) ;

 

  二,逐行分析:

  (1),第一行,引入"connect"模块,通过connect创设多个http|https server,提供http server的全数机能。

    "connect"中间件允许你用二种方法开创"server",   

复制代码 代码如下:

var server = connect.createServer(
     connect.logger()
    , connect.static(__dirname '/public')
) ; // 1
var app = connect() ;
app.use(function (req,res) {
    res.end("Hello,大雄君 !n")  ;
}).listen(8888)  ; // 2

  那么它是什么样做的那,看源码:

复制代码 代码如下:

exports = module.exports = createServer ;
exports.createServer = createServer ;

  将“createServer”挂载到全局的“exports”上,然后再扩大五个“createServer”属性再次挂载,目标是为着同盟原生的书写情势,

完毕了不相同方法开创的指标。这也是大家在常常开垦中得以借鉴的企图。

  (2),再来看第二行"connect.createServer",做了怎么那,看如下源码:

复制代码 代码如下:

 var HTTPServer = require('./http').Server ,
 HTTPSServer = require('./https').Server ;
 function createServer() {
   if ('object' == typeof arguments[0]) {
     return new HTTPSServer(arguments[0], Array.prototype.slice.call(arguments, 1));
   } else {
     return new HTTPServer(Array.prototype.slice.call(arguments));
   }
 };

  "HTTPSServer"和"HTTPServer"基本一致,只是"HTTPSServer"封装的https的章程。在"createServer"的时候,一样能够传递走入一多级的中间件,和随之引进的作用是同样的,但是却只可以绑定到根目录上。

  (3),继续看第三行"app.use()",做了何等那,看如下源码:  

复制代码 代码如下:

 var Server = exports.Server = function HTTPServer(middleware) {
   this.stack = [];
   middleware.forEach(function(fn){
     this.use(fn);
   }, this);
   http.Server.call(this, this.handle);
 };
 /**
  * Inherit from `http.Server.prototype`.
  */
 Server.prototype.__proto__ = http.Server.prototype;

  “connect"是原型承接于"http server"的,它会用use到的中间件替换掉server的requestListener。

  通过"connect.use(route, handle)"来对每一个路由增多中间件,那个中间件"handle"会与"route"绑定保存在贰个"stack"里面,每一趟有"request"央求的时候,

  遍历那么些堆,找到相应"route"的"handle",奉行"handle",假设"handle"最后调用了"next()",就能延续搜寻并推行下二个十分的"handle"。

NodeJS学习笔记之Connect中间件模块。  通过包装"handle",能够很轻松的在"connect"基础上增多更加的多的"middleware"。

 (4),最后看看"listen(8888)",它做些什么专门的学业那?

    相当粗略,通过一而再底层的Server对象,赋予了"listen"的功力,监听特定端口。

    Server.prototype.__proto__ = http.Server.prototype

 以下是”connect.js“的全套源码,为了节约篇幅,注释已整整删掉,如下图:

图片 1

  补充一下:

复制代码 代码如下:

 fs.readdirSync(__dirname '/middleware').forEach(function(filename){
   if (/.js$/.test(filename)) {
     var name = filename.substr(0, filename.lastIndexOf('.'));
     exports.middleware.__defineGetter__(name, function(){
       return require('./middleware/' name);
     });
   }
 });

  将"middleware"对象"exports",然后循环定义给"middleware"对象一种方法,这种艺术是直接加载 "middleware" 文件夹中的.js文件模块。

使用:"exports.utils.merge(exports, exports.middleware)" 这句话将middleware中的方法间接exports了。

三,总计一下:

   (1),领悟源码的规划意图,有利于在动用上赢得最大化的获取。

   (2),看源码时,驾驭流程再去扣语法细节。

   (3),借鉴源码中的美妙达成观念,但绝不过渡设计,为了设计而设计。

   (4),今天再三再四深入分析相关中间件,不断更新中 。。。 。。。

一,开篇深入分析我们好,明天那篇小说首就算对"Connect"中间件以及相关扶持中间件,...

NodeJS学习笔记之Connect中间件模块(一),nodejs学习笔记

企望我们能够百折不挠看下去笔者那多重的文章,那也是对笔者的最大的砥砺与辅助,让大家共同升高,以文种友,相互扶助。好了一向进去明日的核心,

何以是“Connect”,中间件又当什么通晓,带着题材来看今朝的稿子。

图片 2

怎么晓得 "中间件" ?

自己的精通是那样的,中间件正是看似于二个过滤器的东西,在客户端和应用程序之间的一个拍卖恳求和响应的的法子。

一旦把三个http管理进度比作是污水管理,中间件就像一稀缺的过滤网。每个中间件在http管理进度中通过改写request或(和)response的数量,

意况,完毕了一定的功能。

什么是 ”Connect“ ?

咱俩得以把Connec看做一批中间件的集聚。对于每便呼吁,Connect将会选择中间件层来过滤供给,在这之中每四在那之中间件都能够收获HTTP央浼。

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

过滤器管理诉求,可是他们并不针对央求举行应对(想想服务器日志)。

第三种档期的顺序是供应器,它会指向乞请举办回应,你能够依照你的必要使用五当中间件,Http央浼将会经过每贰当中间件直到其中壹当中间件对央求实行应对。

二,Connect内置中间件介绍

图片 3

上边罗列出多少个根本的中间件,而且实例陈说:

(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);

图片 4

(2),原生完毕格局与中间件实现之间的差别化。

(3),通过上述的几在那之中间件例子,掌握用途和动用情况而且仿效相关文书档案明白其他中间件的骨干接纳。

希望大家能够持之以恒看下来小编这一而再串的篇章,那也是对本身的最大的催促与帮衬,让自家...

我们好,后天那篇小说首即便对"Connect"中间件以及相关扶助中间件,做叁个源码解析连串,作者想上一篇小说我们也看了,

什么样是“Connect”,中间件又当什么晓得,带着题材来看今朝的篇章。

介绍了应用格局及用途,而那篇也是出于自小编的兴味,让读者对其有贰个更深透的认知,如在剖判阶段有怎么样不科学的地点,请大家多多指教,

图片 5

好了!老规矩然大家走入正题。先来看贰个例子,结合会用引进深入分析,如下:

哪些晓得 "中间件" ?

复制代码 代码如下:

自己的驾驭是那样的,中间件正是周边于一个过滤器的东西,在客户端和应用程序之间的一个管理供给和响应的的不二法门。

 var connect = require("./lib/connect") ;
 var app = connect.createServer() ;
 app.use(connect.static(__dirname "/public",{
    maxAge: 0 
})) ;
 app.use(function(req,res,next){
     res.end("Hello World !") ;
 })
 .listen(8888) ;

万一把三个http管理进度比作是污水处理,中间件就像一难得一见的过滤网。每个中间件在http管理进程中通过改写request或(和)response的多少,

 

气象,完结了一定的功力。

  二,逐行解析:

什么是 ”Connect“ ?

  (1),第一行,引进"connect"模块,通过connect创造两个http|https server,提供http server的富有功能。

我们得以把Connec看做一批中间件的联谊。对于每贰回呼吁,Connect将会利用中间件层来过滤央求,在那之中每三当中间件都能够赢得HTTP央浼。

    "connect"中间件允许你用多样艺术创设"server",   

T.J Holowaychuk聊起Connect时,他说一共有两类别型的中间件。当中一种是过滤器:

复制代码 代码如下:

过滤器管理央求,可是他们并不针对央浼进行应对(想想服务器日志)。

var server = connect.createServer(
     connect.logger()
    , connect.static(__dirname '/public')
) ; // 1
var app = connect() ;
app.use(function (req,res) {
    res.end("Hello,大雄君 !n")  ;
}).listen(8888)  ; // 2

第二种档案的次序是供应器,它会指向须求实行回答,你可以依照你的供给使用两其中间件,Http央求将会经过每叁当中间件直到在那之中三个中间件对须求实行应对。

  那么它是如何是好的那,看源码:

二,Connect内置中间件介绍

本文由韦德国际1946发布于韦德国际1946国际网址,转载请注明出处:NodeJS学习笔记之Connect中间件模块

关键词: 伟德国际19462211

上一篇:点击鼠标右键,右键哪个被点击的措施
下一篇:没有了