NodeJS学习笔记之Connect中间件模块(二),nodejs学
分类:计算机教程

connect是一个web server中间件。

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"。

  通过封装"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),明天继续分析相关中间件,不断更新中 。。。 。。。

http://www.bkjia.com/Javascript/948860.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javascript/948860.htmlTechArticleNodeJS学习笔记之Connect中间件模块(二),nodejs学习笔记 一,开篇分析 大家好,今天这篇文章主要是对"Connect"中间件以及相关辅助中间件,...

使用方法: 

var connect = require('connect');
connect(
connect.static(__dirname   '/public', { maxAge: 0 })
, function(req, res) {
res.setHeader('Content-Type', 'text/html');
res.end('<img src="/tobi.jpeg" />')
}
).listen(3000);

 

思路:

通过connect创建一个http|https server,提供http server的所有功能。

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

通过connect.use(route, handle)来对每一个路由添加中间件,这些中间件handle会与route绑定保存在一个stack里面,每次有request请求的时候,遍历这个堆,找到对应route的handle,执行handle,如果handle最后调用了next(),就会继续寻找并执行下一个匹配的handle。

通过封装handle,可以很容易的在connect基础上添加更多的middleware。

 

connect.js

有一个createServer方法,可以通过connect()访问到。根据第一个参数,如果是object,就当作是https的选项,创建HTTPSServer,如果第一个参数不是object,则创建HTTPServer,所有的参数(除了https的选项)都是一个中间件handle,会在HTTPServer绑定到‘/’路径上。

HTTPSServer是在HTTPServer的基础上添加了一层,可以启用HTTPS服务。

同时,connect.js会读取middleware文件夹,把里面的中间件读取到,为他们创建getter,可以通过connect.static()访问到。

而每一个中间件文件暴露在外的函数都是返回一个handle。

 

http.js

HTTPServer:初始化的时候会把所有的参数当作handle存放进stack,然后以handle方法为requestListener调用http.Server方法。

HTTPServer随后会继承http.Server的原型。

use(route, handle)

把handle去除外壳之后绑定到route上面,存入stack中。

handle(req, res, next)

遍历整个stack,寻找到req.url与route匹配的元素,执行它的handle。当所有的元素都遍历完还有错误,则输出。

 

util.js

这是一个工具包,里面包含了用到的各种工具函数。

pause(obj)

把传递进来的obj对象的'data'和'end‘事件都保存下来,返回两个函数:end():不再保存事件。resume():停止保存并把之前保存的事件释放出去给obj再次捕获,达到暂停这个obj对象的效果。(感觉可能会有bug,如果在这里释放的时候又有'data'或者'end'事件触发会不会导致顺序变乱?)

parseCookie(str)

把str以;或者,为分隔符分开。每一个都是一个cookie键值对,然后再以=分开。去除value的引号。每个键只能被取得一次。

中间件:

router

connect的route使用方法和express类似。

1 connect(connect.route(function(app){
2     app.get('/:id', middle1, middle2, cb);
3     app.post('/admin', cbpost);
4 }));

route.js内有一个_methods数组,存放所有的route请求方法名称。(get/post/put/...)。

methods对象和routes对象根据_methods内的名称,包含着响应的元素,如:methods['get'], routes['get']。

methods对象,根据_methods数组内的方法名称,为每一个方法调用来一个生产函数,这个函数首先把routes对象内的成员赋值[],然后返回一个函数,这个函数用来产生routes的内容。

methods还有一个元素param,调用它可以为path中出现了某个param的时候设置对应的处理方法。

例如:

app.param('id', function(req, res, next, val){}),

当path中有param id出现的时候,会先调用这个注册的函数再进行后面的操作。

在进行完上述对象的初始化之后,route模块会进行fn.call(this, methods)的调用,即用methods作为参数调用传递进来的匿名函数。所以在app.get('/:id', cb, cb1);的时候,实际调用的是methods.get('/:id', cb, cb1),而methods.get即是之前生产函数的返回函数。

本文由美洲杯赔率发布于计算机教程,转载请注明出处:NodeJS学习笔记之Connect中间件模块(二),nodejs学

上一篇:男篮世界杯赔率Linux查找文件内容的常用命令方法 下一篇:没有了
猜你喜欢
热门排行
精彩图文
  • Linux find tar -type 备份日志
    Linux find tar -type 备份日志
    这几天系统出现一个bug,需要截取日志供研发研究: find精华应用 $ ls -lrt   …… find  path  -option  [  -print ]  [ -exec  -ok  command ]  {} ; -rw-r-----   1 jrtu  
  • 男篮世界杯赔率:创建自己的Gubuntu
    男篮世界杯赔率:创建自己的Gubuntu
    #1,确保你的网络环境连通 关于安装,该主题最好在 gnome 3.16 上安装, 3.14 也测试过。 sudo apt-get install gnome-tweak-tool Server = http://downloads.sourceforge.net/project/
  • Linux下安装炫丽而强大的Dock:Docky
    Linux下安装炫丽而强大的Dock:Docky
    Docky是从GNOME Do项目剥离出来的一个Dock软件,最初即为GNOMEDo的“Docky”模式。 后来开发者觉得,GNOMEDo是个快速启动工具,弄个Docky模式有点不伦不类,于是
  • PHP实现Soap通讯的方法
    PHP实现Soap通讯的方法
    本文实例讲述了PHP实现Soap通讯的方法。分享给大家供大家参考。具体实现方法如下: 复制代码 代码如下: ?php function HttpSoap($server, $port, $url, $namespace, $act
  • 男篮世界杯赔率php结合js实现点击超链接执行删除
    男篮世界杯赔率php结合js实现点击超链接执行删除
    如题,本次是要实现点击超链接实现执行js代码,并确认是否删除数据库数据,采用php。 首先链接数据库,查询数据库数据: 复制代码 代码如下: ?php $db