是否可以將通過express.js發送到domain
或trycatch
see trycatch info here的每個請求打包?如何在域或trycatch中包裝每個快速js請求
我正在嘗試創建一個'捕獲所有'排序(快速錯誤處理程序中間件不捕獲異步調用)以確保我錯過的任何錯誤都與500被髮送給用戶處理。
如果你有一個異步函數調用(如process.nextTick()),那麼這將是明確的錯誤處理的範圍之內,從而殺死進程完全。因此,使用快速錯誤處理程序將不會在所有情況下都起作用。
是否可以將通過express.js發送到domain
或trycatch
see trycatch info here的每個請求打包?如何在域或trycatch中包裝每個快速js請求
我正在嘗試創建一個'捕獲所有'排序(快速錯誤處理程序中間件不捕獲異步調用)以確保我錯過的任何錯誤都與500被髮送給用戶處理。
如果你有一個異步函數調用(如process.nextTick()),那麼這將是明確的錯誤處理的範圍之內,從而殺死進程完全。因此,使用快速錯誤處理程序將不會在所有情況下都起作用。
快遞已經有了錯誤處理程序執行。它從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
之下。
對不起,這並不包括所有情況。我會編輯這個問題,提到我已經考慮過這個問題。如果你有一個異步函數調用(例如process.nextTick()),那麼它將超出express錯誤處理程序的範圍,從而完全終止該進程。有'''domain''和''''trycatch'''模塊可以緩解這個問題,但我不確定如何在域或trycatch中包裝一個明確的請求。 – bzuillsmith
我已更新我的答案。當然可以,但我不認爲這是個好主意。可能你會喜歡在關機時使用自定義,並且像[forever](https:// github)。com/nodejitsu/forever)讓腳本連續運行 – andbas
trycatch在覈心庫中執行大量填充以防止泄漏和其他問題。感謝代碼。不知道我是否可以用trycatch完成相同的操作,但是我想我會將討論轉到trycatch repo – bzuillsmith