[ノード]コアAPI

8665 ワード

1. Events
1.1 EventEmitter
ブラウザでEventモデルがDOMにバインドされているため、NodeはEventEmitterクラスを作成し、ベースのイベント機能を提供します.すべてのノードのイベント機能はEventEmitterの周りにあり、通常は直接呼び出されません.
EventEmitterクラスは一連の方法を提供し、最も主要な2つはonとemitである.onメソッドは、イベントにリスナーを作成します.たとえば、次のようにします.
server.on('event', function(a, b, c) {
});

onメソッドは、リスニングが必要なイベントの名前と、イベントがトリガーされると呼び出される関数の2つのパラメータを受け入れます.EventEmitterはインタフェースであるため、EventEmitterから継承されたクラスはnewキーワードを使用して構築する必要があります.たとえば、次のようになります.
var utils = require('utils');
var EventEmitter = require('events').EventEmitter;
var Server = function() {
  console.log('init');
};
utils.inherits(Server, EventEmitter);
var s = new Server();
s.on('abc', function() {
  console.log('abc');
});

utilsモジュールのinheritsメソッドは、作成したサーバクラスにEventEmitterクラスのメソッドを追加することができます.すなわち、すべてのサーバの新しいインスタンスがEventEmitterメソッドを使用することができます.このイベントは、次のコードでトリガーできます.
s.emit('abc');

これらのイベントは、あるインスタンスに対してグローバルなイベントは存在せず、onメソッドを呼び出すときに、特定のEventEmitterベースのオブジェクトにバインドする必要があります.サーバクラスの異なるインスタンス間でもイベントは共有されません.
1.2 Callback
イベントを使用する重要な部分の1つは、コールバック関数を処理することです.emitを呼び出すと、イベントの名前に加えて、次のような任意の数のパラメータを入力できます.
s.emit('abc', a, b, c);

emit呼び出しに変数が含まれている場合、次のコードを使用して、対応するイベントリスナーを呼び出します.
if (argument.length <= 3) { 
  // quick
  handler.call(this, arguments[1], arguments[2]);
} else { 
  // slow
  var args = Array.prototype.slice.call(arguments, 1);
  handler.apply(this, args);
}

emit()に渡されるパラメータが3つ以下の場合、このメソッドは近道を使用してcallメソッドを直接呼び出します.そうでない場合、遅いapplyメソッドを使用して、すべてのパラメータを配列で渡します.
2. HTTP
2.1 HTTPサーバー
HTTPサーバは最もよく使われる使用シナリオであり、多くの機能があります.HTTPモジュールのサーバ部分は、複雑で包括的なWebサーバを構築するための元のツールを提供します.
HTTPサーバを使用する第一歩はhttpを呼び出すことである.createServer()メソッドを使用して新しいサーバを作成します.これにより、少数のメソッドのみが含まれ、より多くの機能はイベントを使用して提供されます.たとえば、次のように、新しいサーバクラスのインスタンスが返されます.
var http = require('http'); 
http.createServer(function(req, res) { 
  res.writeHead(200, {}); 
  res.end('Hello World'); 
}).listen(9000);

まず、httpモジュールを含みます.次にcreateServerを呼び出し、requestイベントにバインドされる関数をパラメータとして入力します.最後に、作成したサーバに9000ポートをリスニングします.
httpサーバは、クライアントTCPまたはHTTP接続に関連付けられたいくつかのイベントをサポートします.
connectionおよびcloseイベントは、クライアントとのTCP接続の確立および停止を示し、クライアントがHTTP 1.1プロトコルを使用している場合、keepaliveをサポートしている場合、これらのTCP接続が複数のHTTPリクエストにまたがる可能性があることを意味する.
request、checkContinue、upgrade、clientErrorイベントはHTTPリクエストに関連付けられます.chekContinueは特殊なイベントであり、クライアントがデータストリームでサーバにデータを送信する場合、HTTP要求をより直接制御することができる.upgradeイベントは、クライアントがプロトコルのアップグレードを要求するとトリガーされます.このイベントのイベントプロセッサがバインドされていない限り、httpサーバはHTTPアップグレード要求を拒否します.ClientErrorイベントは、クライアントから送信されたerrorイベントを渡します.
リクエストに新しいTCPストリームを作成するとconnectionイベントがトリガーされ、このイベントはTCPストリームをパラメータとしてリクエストに送信します.このデータストリームは、requestが使用するときにrequest、connection変数で取得することもできます.ただし、各ストリームはconnectionイベントを1回のみトリガーするため、1つのクライアントからの複数のリクエストが1回のみ対応する場合があります.
2.2 HTTPクライアント
リモート・サーバにHTTP接続を開始する場合は、NodeもWebサービスを使用したり、ドキュメント・データベースに接続したり、Webページをキャプチャしたりするなど、多くのシナリオで使用できます.同様のhttpモジュールを用いるHTTP要求を開始することができるが、httpを用いるべきである.ClientRequestクラス(例:
var http = require('http'); 
var opts = { 
  host: 'www.google.com', 
  port: 80, 
  path: '/', 
  method: 'get'
}; 
var req = http.request(opts, function(res) { 
  console.log(res); 
  res.on('data', function(data) { 
    console.log(data); 
  }); 
});
req.end();

まず、オブジェクトを構成します.要求される多くの機能を定義します.名前(host)、ポート(port)、パス(path)を指定する必要があります.メソッド(method)はオプションで、指定されていない場合はデフォルトでGETに設定されます.次に、構成オブジェクトでhttpを作成します.ClientRequestインスタンスは、optionsオブジェクトとコールバック関数に渡され、コールバック関数はresponseイベントをリスニングし、responseイベントを受信するとrequestのデータを処理します.
最後に、GETリクエストであるため、サーバにデータを送信しない(end)リクエストを終了する必要があるが、POSTのような他のHTTPメソッドでは、データを送信する必要がある場合があり、requestはend()メソッド呼び出しを待ってから、HTTPリクエストを初期化する.
GETは一般的なHTTPリクエスト方式であるため、例えば、以下のようなより便利な使用のための専門的な工場方法が提供される.
var http = require('http');
var opts = {
  host: 'www.test.com',
  port: 80,
  path: '/'
};
var req = http.get(opts, function(res) {
  console.log(res);
  res.on('data', function(data) {
    console.log(data);
  });
});

GETリクエストの機能と同じですが、POSTは次のようなデータを送信する必要があります.
var http = require('http'); 
var opts = { 
  host: 'www.test.com', 
  port: 80, 
  path: '/'
}; 
var req = http.request(opts, function(res) { 
  console.log(res); 
  res.on('data', function(data) { 
    console.log(data); 
  }); 
}); 
req.write('my data');
req.write('more of my data');
req.end();

ClientResponseオブジェクトには、statusCode(HTTPステータス)やheaderプロパティ(レスポンスヘッダオブジェクト)など、リクエストに関する多くの情報が保存されています.
2.3 URL
URLモジュールは、parse、format、resolveの3つの方法を提供するURL文字列を解析および処理する便利なツールを提供します.ここではparseの使用を説明します.たとえば、次のようにします.
var URL = require('url');
var parsedUrl = URL.parse("http://www.test.com/?param=1");

URLの各セクションを表すデータ構造を返します.href、protocol、host、auth、hostname、port、pathname、search、query、hashが含まれます.
parseにはurl文字列とオプションのブール値の2つのパラメータがあり、queryStringがquerystringモジュールで解析されるべきかどうかを決定します.2番目のパラメータがfalse(デフォルト)の場合、queryにはsearchに似た文字列が含まれますが、先頭の「?」は削除されます.
2.4 querystring
querystringモジュールはquery文字列を処理するための簡単な補助モジュールであり、query文字列からオブジェクトを簡単に抽出する方法を提供し、主な機能はparseとdecodeであり、escape、unescape、unescapeBuffer、encode、stringifyなどの内部補助関数も含まれている.query文字がある場合は、parseを使用してオブジェクトにすることができます.たとえば、次のようにします.
var qs = require('querystring');
qs.parse('a=1&b=2&c=3');

生成されたオブジェクトのプロパティは、対応するquery文字列のキーワードと変数値です.また、数値は文字列に返され、数値型ではなく、入力されたquery文字列にはURLにマークされた「?」が含まれていないことに注意してください.
Querystringのもう一つの重要な部分はencodeです.この関数は、入力したkey-value形式のオブジェクトをquery文字列の形式に変換し、HTTPリクエストを使用する必要がある場合に便利です.
3. I/O
3.1データフロー
ノードの多くのコンポーネントは、入力を連続的に出力または連続的に処理する機能を提供し、stream APIは、一般的な方法およびデータストリームの具体的な実装に必要な属性を提供する.データ・ストリームは、読み取り可能、書き込み可能、読み取り可能に分けられます.
読み取り可能なデータストリームAPIは、送信時にデータソースがデータブロックにアクセスする機能を提供する方法およびイベントのセットである.基本的に読み取り可能なデータストリームは、データのストリーム形式を表すdataイベントのトリガに関連しています.たとえば、次のようにします.
var fs = require('fs');
var filehandel = fs.readFile('test.txt', function(err, data) {
  console.log(data);
});

完全なデータが使用可能になるまで待機する必要がある場合があります.たとえば、次のようなデータプール・モードが使用されます.
var spool = '';
stream.on('data', function(data) {
  spool += data;
});
stream.on('end', function() {
  console.log(spool);
});

3.2ファイルシステム
ファイルシステムモジュールは、すべての機能に非同期および同期の方法を提供しますが、Nodeでコマンドラインスクリプトを作成しない限り、非同期の方法を推奨します.非同期処理で発生する主な問題は、実行順序に不確実性があることです.たとえば、次のようになります.
var fs = require('fs');
fs.readFile('test.txt', function(e, data) {
  console.log('Data: ' + data);
});
fs.unlink('test.txt');

このコードは表面的には問題ありませんが、実行時には正常だったり、正常ではなかったりします.コールバック関数のネストなど、実行する順序を指定するモードが必要です.たとえば、次のようにします.
var fs = require('fs');
fs.readFile('test.txt', function(e, data) {
  console.log('Data: ' + data);
  fs.unlink('test.txt');
});

3.3 Buffer
NodeもJavaScriptを使用していますが、バイナリデータのオリジナル表現はありません.このためノードはBufferクラスをもたらし,操作バイナリデータのためにショートボードを補完した.
BufferはV 8エンジンの拡張で、実際にはメモリへの直接的な割り当てです.Bufferを作成するとサイズが固定され、より多くのデータを追加する必要がある場合は、古いBufferをより大きなBufferにコピーする必要があります.
1つのBufferにコンテンツをコピーすると、バイナリ形式で格納されます.もちろん、Bufferのバイナリコンテンツを文字列などの他のフォーマットに変換することもできます.したがって、Bufferは、符号化または他の意味を示す方法ではなく、そのサイズによってのみ定義される.
Bufferを作成するには、Bufferのバイト長を指定したり、Bufferのバイト配列にコピーしたり、Bufferにコピーしたりする文字列の3つのパラメータを使用します.たとえば、次のようになります.
new Buffer(10); 
new Buffer('test');
new Buffer('test', 'utf8');

Bufferはメモリから直接割り当てられており、元のコンテンツを初期化することはありません.これは元のJavaScriptタイプとは異なります.Nodeは、文字列とBufferの操作を簡略化するためのいくつかの操作を提供します.
まず、Bufferを作成する前に文字列の長さを事前に計算する必要はありません.文字列をパラメータとしてBufferを作成する関数に渡すだけです.あるいはBufferを用いることもできる.byteLength()メソッドは、文字列の符号化上のバイト長を得る.
次に、既存のBufferに文字列を書き込むこともできます.Buffer.write()は、Bufferが指定した位置に文字列を書きます.Bufferが指定した場所から十分なスペースがある場合、文字列全体が書き込まれます.そうしないと、文字列の末尾が切断されます.Buffer.write()は、書き込みに成功したバイト数を示す数値を返します.条件が許す場合、UTF-8に書き込む場合、Buffer.write()に書き込まれた文字列はNULL文字で終わります.
本文は“青鋒ノート”のブログから出て、転載をお断りします!