簡體   English   中英

節點,Express,域,未捕獲的異常 - 仍然丟失

[英]Node, Express, domains, uncaught exceptions - still lost

我已經在Node上閱讀了幾個小時的異常處理。 我理解使用uncaughtException的缺點,我知道關閉進程有利於防止“任何事情都可能發生”的任何“未知狀態”。 我理解使用是一種方法,我理解如何正確實現域,特別是顯式綁定 ...

...但我仍然沒有得到任何結果只是基本的錯誤處理。

我希望能夠捕獲任何未捕獲的異常以進行日志記錄。 我不介意殺死這個過程或任何其他被認為是“不受歡迎的”。 我只想要一個日志。

我覺得我不應該把所有東西都包在try / catch中或使用一些庫來emit錯誤...如果我錯了請糾正我,我會改變我的方式。

我正在使用Node和Express,我有以下簡單的代碼:

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

var serverDomain = domain.create();
serverDomain.on('error', function(err) {
    console.log("SERVER DOMAIN ERROR: " + err.message);
});

serverDomain.run(function() {
    var app = express();
    app.get('/testing', function() {
        app.nonExistent.call(); // this throws an error
    });

    var server = app.listen(8000, function() {
        console.log('Listening on port %d', server.address().port);
    });
});

錯誤顯示在控制台中,但控制台從未收到“SERVER DOMAIN ERROR ...”消息。 我也嘗試在自己的域中包裝請求/響應,但無濟於事。 更令人失望的是,使用以下內容也不起作用:

process.on('uncaughtException', function(err) {
    console.log('uncaughtException caught the error');
});

難道我做錯了什么? 我從哪里開始? 我怎樣才能發現上述錯誤?

發生這種情況是因為Express會自行處理可能出現的錯誤,並以這種方式簡化您的工作。 有關錯誤處理,請參閱Express Guide 您應該使用下面的結構來處理可能出現的錯誤:

app.use(function(err, req, res, next){
    console.error(err.stack);
    res.send(500, 'Something broke!');
});

您可以使用connect-domain

問題是在Connect的路由期間發生異常,它在執行時都有一個try / catch塊,以及一個默認的錯誤處理程序,它在非生產模式下運行時打印出堆棧跟蹤細節。 由於異常是在Express內部處理的,因此它永遠不會到達外層以供域處理。

以下是使用connect-domain包而不是domain的示例。

http://masashi-k.blogspot.com/2012/12/express3-global-error-handling-domain.html

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

var app = express();
app.use(connectDomain());
app.get('/testing', function() {
    app.nonExistent.call(); // this throws an error
});

app.use(function(err, req, res, next) {
    res.end(err.message); // this catches the error!!
});

var server = app.listen(8000, function() {
    console.log('Listening on port %d', server.address().port);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM