nodejs(八)----ドメイン(domain)を一緒に読みます.

7794 ワード

本論文はnodejs 0.8.9バージョンのapi開発マニュアルの解読である.nodejsウェブサイト.
ドメイン(Domain)
stability:1-experimental
ドメインは、単純に複数の異なるio動作を個々のグループと見なす方法を提供しています.任意のイベント送信機またはドメインに登録されているコールバック関数が、errorイベントを発行したり、errorエラー情報を抛り出したりすると、ドメインはprocess.on('caugughttion')の処理関数のように文脈を失うのではなく通知されます.またはコードでプログラムを終了させます.
これはnode 0.8バージョンの中で新たに増加した特性です.これは初めて登場しました.他のこれからもっと重要な役割があります.それを使ってフィードバックを提供してください.
その試験性質のため、ドメインの特性はdomainモジュールに一度ロードしてから有効になります.ドメインがない場合はデフォルトで作成または登録されます.これは意図的にこのように設計されています.現在のプログラムで不利な影響を避けるために、未来のnodeバージョンではデフォルトの有効に変更されることを期待しています.
エラーオブジェクトの追加(additions to Error object)
いつでも、一つのerrorオブジェクトが一つのdomainにルーティングされる場合、いくつかの追加フィールドをerrorオブジェクトに追加する必要があります.error.domain The domann that first handed the error.errorを初めて処理するdomainオブジェクトerror.domain_emitter The event ement that ement ted an'error'event with the error oject.errorイベントの対象となるerror.domain_bound The calback function which was bound to the doman,and passed an error as its first argment.domanに結合されたcalback,calbackの最初のパラメータはerror.として指定されます.error.domain_thrown A bootlean indicating whethe r the error was thrown、emited、or passed to a bound calback function.一つのbollanオブジェクトは、このerrorオブジェクトが投げ出されているかそれとも発行されているか、またはdomanバインディングのcalbackに渡されているかを指定します. 
EventEmitterがエラーに遭遇した時、典型的な動作はerrorイベントを発行します.nodeの中で、errorイベントは特殊な状況として処理されます.対応する傍受関数がない場合、デフォルトの動作はスタック情報を印刷してプログラムを終了します.
すべてのEventEmitterオブジェクトは、新しい傍受関数を追加すると、newListenerイベントを発行します.
 
暗黙的バインディング(Implicit Binding)
domainが有効になったら、すべての新しいEventEmitterオブジェクト(Streamオブジェクト、requestオブジェクト、reponseオブジェクトなどを含む)は彼らが作成された時に、このアクティブなdomainに暗黙的に紐付けされます.
また、低レベルのイベントサイクル要求(例えば、fs.open、またはcalback-taring方法)に渡されると、自動的にアクティブなdomainにバインドされます.異常を投げたら、domainはエラー情報をキャプチャします.
メモリの過剰使用を避けるために、domainオブジェクトは現在アクティブなdomainのサブオブジェクトとして暗黙的に追加されません.彼らが存在する場合、requestとreponseのオブジェクトが適切なごみ収集の対象となることを容易に阻止できません.
ドメーンオブジェクトを埋め込む必要がある場合は、彼らを明確に追加する必要があります.そして後でdisposeを呼び出します.
隠しバインディング経路はエラー情報とerrorイベントをdomainのerrorイベントに飛び出すが、domainオブジェクトにイベントトリガーを登録しないので、domain.dispose()はイベントトリガーを閉じることはない.隠しバインディングは投げられたエラー情報とerrorイベントを処理するだけである.
バインディング(Explicit binding)を表示します.
domainオブジェクトは、特定のイベントの送信機として使用されるべきではない.または、イベント送信機は、domainの環境変数の中で作成されているが、他のdomainにバインドされるべきである.
例えばここにhttpサーバーのdomainオブジェクトがありますが、私達はそれぞれのrequestで単独のdomainを使いたいです.
バインディングを表示することで実現することができます.
たとえば:
// create a top-level domain for the server
var serverDomain = domain.create();

serverDomain.run(function() {
  // server is created in the scope of serverDomain
  http.createServer(function(req, res) {
    // req and res are also created in the scope of serverDomain
    // however, we'd prefer to have a separate domain for each request.
    // create it first thing, and add req and res to it.
    var reqd = domain.create();
    reqd.add(req);
    reqd.add(res);
    reqd.on('error', function(er) {
      console.error('Error', er, req.url);
      try {
        res.writeHead(500);
        res.end('Error occurred, sorry.');
        res.on('close', function() {
          // forcibly shut down any other things added to this domain
          reqd.dispose();
        });
      } catch (er) {
        console.error('Error sending 500', er, req.url);
        // tried our best.  clean up anything remaining.
        reqd.dispose();
      }
    });
  }).listen(1337);
});
 
 
domain.creat()
 
  • return:Domain
  • 新しいdomainオブジェクトを返します.
     
     
    Class:Domain
    domann類はルートerrorとuncauhtをカプセル化しました.
    domain類はEventEmitterのサブクラスで、domainで捕獲されたエラー情報を処理するなら、errorイベントを傍受することができます.
     
    domann.run(fn)
     
  • fn Fnction
  • domainのコンテキストで提供されたfunctionを実行し、すべてのイベントトリガー、タイマー、domainコンテキストで作成された低レベルのrequestsを暗黙的に結合する.
    これはdomainを使う一番基本的な方法です.
    例:
    var d = domain.create();
    d.on('error', function(er) {
      console.error('Caught error!', er);
    });
    d.run(function() {
      process.nextTick(function() {
        setTimeout(function() { // simulating some various async stuff
          fs.open('non-existent file', 'r', function(er, fd) {
            if (er) throw er;
            // proceed...
          });
        }, 100);
      });
    });
    この例では、do.on('error')プロセッサは、プログラム切断ではなくトリガされます.
    domann.members
  • Aray
  • domainに結合されたタイマーとイベントトリガーの配列を表示します.
    domann.add
  • .イベントトリガーまたはタイマートリガーまたはタイマーがdomainに追加されます.
  • .
    イベントフリップフロップがエラーをスローした時、イベントハンドラが呼び出された時、またはこのイベントトリガーがerrorを発行した時、彼らはdomainのerrorイベントにルーティングされます.
    タイマーがsetIntervalまたはsetTimeoutから戻ってきた時もこのように動作します.彼らのコールバック関数が異常を投げた場合、domainのerrorイベントハンドリング関数によって捕獲されます.
    タイマーまたはイベントトリガーがdomainにバインドされている場合、nodeは彼らを元のdomainから削除し、現在のdomainに追加します.
    domann.remove(emiter)
  • .イベントトリガーまたはタイマートリガーまたはタイマーはdomanから取り外されます.
  • domann.addとは反対に、この方法は指定されたフリップフロップからdomainを除去する処理操作です.
    domann.bind(cb)
  • cb functionコールバック関数.
  • return:function,バインディング後の関数
    戻ってきた関数は、提供されたコールバック関数を包む関数となります.このリターンの関数が呼び出されたとき、投げられたエラーは、domainのerrorイベントにルーティングされます.
    var d = domain.create();
    
    function readSomeFile(filename, cb) {
      fs.readFile(filename, 'utf8', d.bind(function(er, data) {
        // if this throws, it will also be passed to the domain
        return cb(er, data ? JSON.parse(data) : null);
      }));
    }
    
    d.on('error', function(er) {
      // an error occurred somewhere.
      // if we throw it now, it will crash the program
      // with the normal line number and stack message.
    });
    domann.intercept(cb)
  • cb functionコールバック関数.
  • return:function,遮断された関数
    この方法はほとんどdomann.bind(cb)方法と同じです.しかし、投げられたエラー情報をキャプチャする以外に、errorオブジェクトをブロックし、リターンが必要な関数の最初のパラメータとして扱います.
    このようにして、比較的によくあるのは、if return cb(er)このような方式は取って代わられることができて、あなたは単独で1つの誤りの処理handlerの中ですべてのerror情報を処理するだけ必要があります.
    例:
    var d = domain.create();
    
    function readSomeFile(filename, cb) {
      fs.readFile(filename, 'utf8', d.intercept(function(data) {
    //         d.intercept()         ,            error  ,         d.on('error',fn)   .     domain.run    domain.run                domain  ,    domain      . domain.intercept(),             .             .
        // note, the first argument is never passed to the
        // callback since it is assumed to be the 'Error' argument
        // and thus intercepted by the domain.
    
        // if this throws, it will also be passed to the domain
        // so the error-handling logic can be moved to the 'error'
        // event on the domain instead of being repeated throughout
        // the program.
        return cb(null, JSON.parse(data));
      }));
    }
    
    d.on('error', function(er) {
      // an error occurred somewhere.
      // if we throw it now, it will crash the program
      // with the normal line number and stack message.
    });
    domann.dispose()
    dispose方法はdomainオブジェクトを破壊し、すべてのioとこのdomailに関連するオブジェクトまたはイベントをクリアする際に最善を尽くします.ストリームは終了されます.終了されます.終了されます.そして/または廃棄されます.タイマーはクリアされます.所定のコールバック関数が呼び出しられます.domainから発生する任意のerrorイベントも無視されます.
    disposeを呼び出す意図は、通常domainの環境変数がエラー状態で発見されたときにカスケードエラーが発生しないようにするためである.
    domainがdisposedに落ちたら、disposeイベントが発生します.
    注意:io操作はまだ実行されるかもしれません.しかし、可能性を最大限に達するために、いったんdomainがdisposedされると、domainの中の送信機のセットに発生したり、エラーメッセージが無視されたりします.