3

app.js

_app.configure(function()
{
    /**
     * app setup
     */
    _app.set('port', process.env.PORT || 3000);
    _app.use(express.methodOverride());
    _app.use(function(req, res, next){
        console.log('%s %s', req.method, req.url);
        next();
    });
    _app.use(_app.router);
    _app.use(express.static(__dirname+'/public'));
});

process.on('uncaughtException', function (err, req, res) {
    console.log( res );
    _winston.error(err.message, err.code);
});

キャッチされない場合は、コンソールにメッセージを表示できますが、JSON 応答もブラウザーに送信したいと考えています。これどうやってするの?uncaughtException から res/req にアクセスするにはどうすればよいですか?

ありがとう!

4

2 に答える 2

3

私の知る限り、キャッチされない例外は高速コールバックだけでなく、コードのどこでも発生する可能性があるため、不可能です。おそらく必要なのは、エクスプレス エラー ハンドラを使用することです。

_app.error(function(err, req, res, next) {
   res.json({ ... });
});
于 2013-11-10T01:52:56.280 に答える
2

このモジュール: https://github.com/baryshev/connect-domainは、ドメイン ( http://nodejs.org/api/domain.html )を使用してこの問題に対処します。次のように使用する単純な接続ミドルウェアです (github ページから取得)。

var
    connect = require('connect'),
    connectDomain = require('connect-domain');

var app = connect()
    .use(connectDomain())
    .use(function(req, res){
        if (Math.random() > 0.5) {
            throw new Error('Simple error');
        }
        setTimeout(function() {
            if (Math.random() > 0.5) {
                throw new Error('Asynchronous error from timeout');
            } else {
                res.end('Hello from Connect!');
            }
        }, 1000);
    })
    .use(function(err, req, res, next) {
        res.end(err.message);
    });

app.listen(3000);

私はこのモジュールを使用して成功しています。ヒントは、スタック内のどこに connect-domain を導入するかを観察することです: https://github.com/baryshev/connect-domain/issues/12

于 2013-11-10T23:46:02.570 に答える