2013-10-30 41 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

相关问题