是否可以将通过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