taediumの日記

2012-04-20

[][] node.jsでDomainを関数ごとに作ってエラーハンドリング

node.js Domain 時代のエラー処理のコーディングパターンで、node-v0.7.8でDomainという機能が入ったのを知りました。


これはいいですね! さっそく、自分好みの使い方を考えてみました。

それは、Domainを関数ごとに作る、というもの。こんな感じ。


var fs = require('fs');
var domain = require('domain');

function countChars(filename, callback) {
    var d = domain.create().on('error', function (err) {
	callback(err); // 呼び出し元にエラーを通知
    });
    fs.readFile(filename, 'utf-8', d.intercept(function (_, data) {
	callback(null, data.length); // 正常処理
    }));
}

function main(args) {
    var d = domain.create().on('error', function (err) {
	console.error(err);
    });
    countChars(args[0], d.intercept(function (_, length) {
	console.log(length);
    }));
}

main(['nonexistent']);

ポイント

  • Domainを関数ごとに作る。エラーハンドリングも関数ごと。
  • interceptすれば第一引数のエラーオブジェクトは渡ってこないけど、わかりやすさ優先でCallbackの第一引数はエラーオブジェクトで統一

関数の独立性が高まっていい感じ、じゃない?


ところで、interceptって文字数がちょっと長いですね。bindに負けず劣らずの短くていい名前があればいいんですけどねー。