2013-10-30 44 views
10

是否可以將通過express.js發送到domaintrycatchsee trycatch info here的每個請求打包?如何在域或trycatch中包裝每個快速js請求

我正在嘗試創建一個'捕獲所有'排序(快速錯誤處理程序中間件不捕獲異步調用)以確保我錯過的任何錯誤都與500被髮送給用戶處理。

如果你有一個異步函數調用(如process.nextTick()),那麼這將是明確的錯誤處理的範圍之內,從而殺死進程完全。因此,使用快速錯誤處理程序將不會在所有情況下都起作用。

回答

8

快遞已經有了錯誤處理程序執行。它從connect繼承它。要使用它,您需要將其添加爲最後一箇中間件點(最後一個app.use(...)調用)。例如:

var express = require('express') 
    , app = express(); 

app.use(app.router); 
app.use(express.errorHandler()); 

// app.get(...), app.post(...), app.listen(...), etc. 

如果要處理與簡單的500響應代碼所有的錯誤,你可以用你自己的函數替換express.errorHandler()。在這種情況下,你的代碼將是這樣的:

var express = require('express') 
    , app = express(); 

app.use(app.router); 
app.use(function(err, req, res, next){ 
    if (!err) return next(); 
    res.send(500); 
}); 

// app.get(...), app.post(...), app.listen(...), etc. 

關於這樣的更多信息可以在express error example註釋中找到的代碼

UPDATE

當然,你可以使用域名爲每個請求。您可以分別包裝每個請求或使用包裝路由器來處理所有異常。代碼如下:

var express = require('express') 
    , http = require('http') 
    , app = express() 
    , domain = require('domain'); 

//app.use(app.router); 
app.use(function(req, res, next){ 
    var d = domain.create(); 
    d.on('error', function(er) { 
     console.log('error, but oh well', er.message); 
     res.send(500); 
    }); 

    // explicitly add req and res 
    d.add(req); 
    d.add(res); 

    d.run(function() { 
     app.router(req, res, next); 
    }); 
}); 

app.get('/', function(req,res){ 
    process.nextTick(function(){ 
     throw new Error('Check Error'); 
    }); 
}); 

http.createServer(app).listen(3000, function(){ 
    console.log('Express server listening on port 3000'); 
}); 

!!但是,從不在生產中使用。這就是JS在自然界拋出工作的原因。它肯定會成爲您的應用程序泄漏的原因,並使其更加不穩定。您可以使用此類錯誤處理來實現關閉的自定義算法(例如關閉已打開的連接)。有關正確使用域的更多信息可以在documentation中找到。

要監視泄漏你可以使用該技術從this article

更新2

我不能離開這個沒有完成。 trycatch代碼:

var express = require('express') 
    , http = require('http') 
    , app = express() 
    , domain = require('domain') 
    , trycatch = require('trycatch'); 

//app.use(app.router); 
app.use(function(req, res, next){ 
    trycatch(function(){ 
      app.router(req, res, next); 
     }, function(er){ 
      console.log(er.message); 
      res.send(500); 
     }); 
}); 

app.get('/', function(req,res){ 
    process.nextTick(function(){ 
     throw new Error('Check Error'); 
    }); 
}); 

http.createServer(app).listen(3000, function(){ 
    console.log('Express server listening on port 3000'); 
}); 

我不得不檢討trycatch源,也沒有任何魔法。它仍然是泄漏的原因。 trycatch已在domain之下。

+1

對不起,這並不包括所有情況。我會編輯這個問題,提到我已經考慮過這個問題。如果你有一個異步函數調用(例如process.nextTick()),那麼它將超出express錯誤處理程序的範圍,從而完全終止該進程。有'''domain''和''''trycatch'''模塊可以緩解這個問題,但我不確定如何在域或trycatch中包裝一個明確的請求。 – bzuillsmith

+0

我已更新我的答案。當然可以,但我不認爲這是個好主意。可能你會喜歡在關機時使用自定義,並且像[forever](https:// github)。com/nodejitsu/forever)讓腳本連續運行 – andbas

+0

trycatch在覈心庫中執行大量填充以防止泄漏和其他問題。感謝代碼。不知道我是否可以用trycatch完成相同的操作,但是我想我會將討論轉到trycatch repo – bzuillsmith

相關問題