ホームページ  >  記事  >  ウェブフロントエンド  >  NodeJS学習ノート Connectミドルウェアモジュール(2)_node.js

NodeJS学習ノート Connectミドルウェアモジュール(2)_node.js

WBOY
WBOYオリジナル
2016-05-16 16:17:44845ブラウズ

1、分析を開始します

皆さんこんにちは。今日の記事は主に「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) ;

2 番目の行ごとの分析:

(1) の最初の行では、「connect」モジュールを導入し、connect を通じて http|https サーバーを作成し、http サーバーのすべての機能を提供します。

「connect」ミドルウェアを使用すると、さまざまな方法で「サーバー」を作成できます。

コードをコピーします コードは次のとおりです:

var サーバー = connect.createServer(
Connect.logger()
、connect.static(__dirname '/public')
) ; // 1
var app = connect() ;
app.use(function (req,res) {
res.end("こんにちは、のび太!n") ;
}).listen(8888) // 2

では、どのように行われるのでしょうか? ソースコードを参照してください:

コードをコピーします コードは次のとおりです:

エクスポート = module.exports = createServer ;
exports.createServer = createServer ;

"createServer" をグローバル "exports" にマウントし、次に "createServer" 属性を拡張して再度マウントします。目的は、ネイティブの記述形式

と互換性を持たせることです。

さまざまな方法で創作の目的を達成します。これは、誰もが日々の開発において学ぶことができるアイデアでもあります。

(2) 2 行目の「connect.createServer」を見て、その動作を見てみましょう。次のソース コードを参照してください。

コードをコピーします コードは次のとおりです:
var HTTPServer = require('./http').Server ,
HTTPSServer = require('./https').Server ;
function createServer() {
if ('object' == 引数の種類[0]) {
新しい HTTPSServer(arguments[0], Array.prototype.slice.call(arguments, 1));
を返します。 } else {
return new HTTPServer(Array.prototype.slice.call(arguments));
}
};

「HTTPSServer」と「HTTPServer」は、「HTTPSServer」が https メソッドをカプセル化することを除いて、基本的に同じです。 「createServer」の場合、一連のミドルウェアを渡すこともできます。これは後続の導入と同じ効果がありますが、ルート ディレクトリにのみバインドできます。

(3)、引き続き 3 行目の「app.use()」を見てください。何が行われるのか、次のソース コードを見てください。

コードをコピーします コードは次のとおりです:
var Server = exports.Server = function HTTPServer(ミドルウェア) {
This.stack = [];
middleware.forEach(function(fn){
This.use(fn);
}, これ);
http.Server.call(this, this.handle);
};
/**
  * `http.Server.prototype`.
から継承  */
Server.prototype.__proto__ = http.Server.prototype;

"connect" は "http サーバー" から継承されたプロトタイプであり、サーバーの requestListener を使用するミドルウェアに置き換えます。

「connect.use(route, handle)」を使用してミドルウェアを各ルートに追加します。これらのミドルウェア「ハンドル」は「リクエスト」があるたびに「ルート」にバインドされ、「スタック」に保存されます。リクエストしました、

このヒープを走査し、「ルート」に対応する「ハンドル」を見つけて、「ハンドル」を実行します。「ハンドル」が最終的に「next()」を呼び出すと、引き続き次の一致する「ハンドル」を見つけて実行します。

「ハンドル」をカプセル化することで、「接続」に基づいてさらに「ミドルウェア」を簡単に追加できます。

(4)、最後に「listen(8888)」を見てみましょう。これは何をするものでしょうか?

これは非常に簡単です。基になるサーバー オブジェクトを継承することで、特定のポートでリッスンする「リッスン」機能が与えられます。

Server.prototype.__proto__ = http.Server.prototype

以下は、「connect.js」のソース コード全体です。スペースを節約するために、すべてのコメントが削除されています。

追加:

コードをコピーします コードは次のとおりです:

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

「ミドルウェア」オブジェクトを「エクスポート」し、「ミドルウェア」オブジェクトにメソッドをループ定義します。このメソッドは、「ミドルウェア」フォルダー内の .js ファイル モジュールを直接読み込みます。

使用: "exports.utils.merge(exports,exports.middleware)" この文はミドルウェア内のメソッドを直接エクスポートします。

3 つを要約すると、

(1) ソース コードの設計意図を理解することは、アプリケーションでの利点を最大化するのに役立ちます。

(2) ソースコードを見るときは、文法的な詳細に注意を払う前に、プロセスを理解してください。

(3) ソースコードの賢明な実装アイデアから学びますが、過剰な設計はせず、設計のための設計を行います。

(4)、明日も引き続き関連ミドルウェアの解析を行い、アップデートを継続していきます。 。 。 。 。 。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。