手机版

连接NodeJS学习笔记(2)的中间件模块

时间:2021-10-14 来源:互联网 编辑:宝哥软件园 浏览:

一、开篇分析。

大家好,今天的文章主要是对‘Connect’中间件以及相关的辅助中间件做一系列的源代码分析,我想大家都看完了上一篇文章。

介绍用法和用途,这篇文章也是出于我的兴趣,让读者对它有更深的了解。如果分析阶段有什么不对的地方,请给出你的建议。

好吧。像往常一样,让我们言归正传。我们先看一个例子,结合介绍来分析,如下:

复制代码如下:VARConnect=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!') ;}).听(8888);

二、逐行分析:

(1)第一行介绍了‘connect’模块,通过connect创建了一个http|https服务器,提供了http服务器的所有功能。

“连接”中间件允许您以各种方式创建“服务器”。

复制代码如下: varserver=connect . createserver(connect . logger()、connect . static(_ dirname/' public ');//1 var app=connect();App.use (function (req,res) {res.end('你好,大雄君!\ n ');}).听(8888);//2

那么它是如何做到的呢?看看源代码:

复制代码如下:exports=module。exports=createserverexports . CreateServer=CreateServer;

在全局“导出”上挂载“createServer”,然后扩展一个“createServer”属性重新挂载,以便与原写表单兼容。

用不同的方式达到创作的目的。这也是每个人在平时发展中可以借鉴的一个理念。

(2)看第二行“connect.createServer”,看下面的源代码:

复制代码如下:var http server=require('。/http ')。服务器,https服务器=require('。/https ')。服务器;函数createServer(){ if(' object '==type of arguments[0]){返回新的httpserver(arguments[0],array . prototype . slice . call(arguments,1));} else {返回新的HttpServer(Array . prototype . slice . call(arguments));}};

“HTTPServer”与“HTTPServer”基本相同,只是https的方法由“HTTPServer”封装。在‘createServer’的时候,也可以传入一系列的中间件,和后续介绍的效果一样,但是只能绑定到根目录。

(3)、继续看第三行‘app . use()’,看下面的源代码:

复制代码如下: var server=exports . server=function http server(中间件){ this . stack=[];中间件. foreach(function(fn){ this . use(fn);},这个);http。Server.call(this,this . handle);};/** *继承自` http . server . prototype `. */server . prototype . _ _ proto _ _=http。Server.prototype

“connect”是从“http server”继承而来的原型,它将用使用的中间件替换服务器的requestListener。

通过“connect.use(route,handle)”向每个路由添加中间件。这些中间件“句柄”将与“路由”绑定,并存储在“堆栈”中。每次有“请求”请求,

遍历堆,找到“路由”对应的“句柄”,执行“句柄”。如果“handle”最终调用“next()”,它将继续搜索并执行下一个匹配的“handle”。

通过封装“句柄”,您可以基于“连接”轻松添加更多的“中间件”。

(4)最后看‘听(8888)’。它是做什么的?

很简单,通过继承底层的Server对象,赋予它“监听”特定端口的功能。

server . prototype . _ _ proto _ _=http。Server.prototype

以下是“connect.js”的完整源代码。为节省空间,已删除所有评论,如下所示:

添加:

复制代码如下: fs . readdirsync(_ dir name/'中间件')。foreach(函数(文件名){if (/\)。js $/。test(filename)){ var name=filename . substr(0,filename.lastindexof(' . ')).exports . middleware . _ _ defineGetter _ _(name,function(){ return require('。/中间件/'名称);});}});

它是一种定义‘中间件’对象‘导出’然后循环到‘中间件’对象的方法,也就是直接加载。“中间件”文件夹中的js文件模块。

使用短语:‘exports . utils . merge(exports,exports . middleware)’直接导出中间件中的方法。

第三,总结一下:

(1)了解源代码的设计意图,有助于在应用中收获最大化。

(2)阅读源代码时,先了解过程,再推演语法细节。

(3)借鉴源代码中巧妙的实现思路,但不要过度设计,为设计而设计。

(4)明天继续分析相关中间件,不断更新。

版权声明:连接NodeJS学习笔记(2)的中间件模块是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。