2012-07-22 13 views

答えて

12

スピーカーデッキ上のスライドのこのセットは、簡潔な概要を説明します

var createDomain = require('domain').create; 

app.use(function(req, res, next) { 
    var domain = createDomain(); 

    domain.on('error', function(err) { 
    // alternative: next(err) 
    res.statusCode = 500; 
    res.end(err.message + '\n'); 

    domain.dispose(); 
    }); 

    domain.enter(); 
    next(); 
}); 
+4

これをテストしましたか?それは私にとってはうまくいかず、domain.enterはノードのサイトで文書化されていません。 –

+0

これは私のために働く。なぜdomain.enterが文書化されていないのか分かりません。 –

+3

私は、このコードがdomain.enterを呼び出しても、それに対応するdomain.exitは存在しないと心配しています。漏れの可能性があります。 –

5

私は交換する幸運を持っていました株式

var app = express.createServer(); 

var domainCreate = require('domain').create; 
var app = express.createServer(function (req, res, next) { 
    var domain = domainCreate(); 
    domain.run(next); 
}); 

は、その後、あなたのミドルウェアであなたはprocess.domainまたは追加のエラー処理を追加するためのプロパティを追加することができます。

+1

これは良い点であるかもしれませんが、 'express.createServer'は廃止されました。 – Jess

+0

このドメインの特定のエラー処理をしていない場合の目的は何ですか? –

12

UPDATE:次の方法は、ConnectまたはExpressアプリケーションで使用できるNodeJSモジュールのconnect-domainで実装されています。

Express 3では、express.createServerは推奨されておらず、そのコールバックはミドルウェアに変換する必要があります。ミドルウェアでは、requestドメインにrequestオブジェクトとresultオブジェクトを追加して、それらによって起動されたエラーがドメインエラーハンドラによって処理されるようにすることが重要です。

私のミドルウェアは、次のようになります。

var domain = require('domain'); 

app.use(function(req, res, next) { 
    var requestDomain = domain.create(); 
    requestDomain.add(req); 
    requestDomain.add(res); 
    requestDomain.on('error', next); 
    requestDomain.run(next); 
}); 

あなたはトップレベルドメイン内からhttp.createServerを呼び出す場合、要求ドメインへのリクエストとレスポンスを追加することを避けることができますが、ドメインのドキュメントがあることを示しているように見えます要求ごとのドメインはベストプラクティスです。

上記のコードでは、要求ドメインを強制的に破棄するなどのドメインクリーンアップアクションは実行されません。私のミドルウェアは、代わりにミドルウェアスタックにエラーを渡して、後で特定のエラー処理ミドルウェアによって処理されるように選択します。 YMMV。

+0

第三者libsでスローされた例外から保護してください... :( – Jess

+0

@Jess、ここでのエラー処理は素朴ですが、私はあなたが見ているものが不思議です。理論的には、 –

+0

where節が有効な構文を持たない場合に例外をスローするsequelizeを使用しています。コードを変更できません。 'throw 'ではなく' emit'を実行します。私はここに記載されているすべてのソリューションを試したが、どれも投げられたエラーをキャッチしていないようだ。 – Jess

2

これは遅い回答ですが、express-domain-moddlewareモジュールをチェックしてください。要求ごとに新しいドメインが自動的に作成されます。アクティブなドメインは、あなたのルートのprocess.domainによって参照できます。次に例を示します。ドメインは、現在のノードに廃止され

//with domain-middleware 
app.use(require('express-domain-middleware')); 
app.use(app.router); 

app.use(function errorHandler(err, req, res, next) { 
    console.log('error on request %d %s %s: %j', process.domain.id, req.method, req.url, err); 
    res.send(500, "Something bad happened. :("); 
    if(err.domain) { 
    //you should think about gracefully stopping & respawning your server 
    //since an unhandled error might put your application into an unknown state 
    } 
}); 

app.get('/error', function(req, res, next) { 
    db.query('SELECT happiness()', process.domain.intercept(function(rows) { 
    fs.readFile('asldkfjasdf', process.domain.intercept(function(contents) { 
     process.nextTick(process.domain.intercept(function() { 
     throw new Error("The individual request will be passed to the express error handler, and your application will keep running."); 
     })); 
    })); 
    })); 
}); 
+0

私は 'express-domain-middleware'がこの質問に対する最もよく焼き付けられた(そしてまだ維持されている)答えのように見えるので、これを却下しました。同じ著者による 'node-ok'に加えて、node/expressにおけるエラー処理のための頑強なソリューションのように見えます。同じ話題に多少関連しているもう1つのリンクを追加します:エラーが発生した後にエラーに応答する方法:https://github.com/hapijs/boom –

0

https://nodejs.org/api/domain.html

「ゾーニングエラー」の目的のために、私はあなたが非同期書き込みを可能にするライブラリを作成しましたいい方法でコード:https://github.com/vacuumlabs/yacol。そのメリットの1つは、非常に優れたセマンティクスでドメインのような動作を実現できることです。見てみな!

関連する問題