如何将每个快速 js 请求包装在域或 trycatch 中
How can I wrap every express js request in a domain or trycatch
是否可以将每个通过 express.js 的请求包装成domain
或trycatch
在此处查看 trycatch 信息?
正在尝试创建各种"捕获所有"(快速错误处理程序中间件不会捕获异步调用),以确保我错过的任何错误都通过发送给用户的 500 来处理。
如果你有一个异步函数调用(例如process.nextTick()),那么它将超出express的错误处理程序的范围,从而完全杀死进程。因此,使用快速错误处理程序并非在所有情况下都有效。
Express 已经有了错误处理程序实现。它从连接继承它。要使用它,您需要将其添加为最后一个中间件点(最后一个 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.
有关这种方式的更多信息可以在代码中的显式错误示例注释中找到
更新:
当然,您可以为每个请求使用域。您可以单独包装每个请求,也可以使用路由器包装来处理所有异常。代码如下:
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抛出工作原理。这肯定会成为应用程序中泄漏的原因,并使其更加不稳定。您可以使用此类错误处理来实现自定义关闭算法(例如关闭已打开的连接)。有关正确使用域名的更多信息,请参阅文档。
要监视泄漏,您可以使用本文中的技术。
更新 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
在引擎盖下。
相关文章:
- 如何将函数包装在函数中以避免代码重复
- 同位素库错误:未捕获错误无布局模式包装生产线8
- 为什么要包装每一个原型“;类“;JS中具有匿名函数的对象
- 在'物品包装'
- 如何在jQuery中包装两个元素的组
- 如何在包装功能中咕哝concat
- 用类javascript包装span标记中字符串中的字符索引
- 在jquery$({})中包装纯javascript对象
- 从工作日结束到下一个工作日开始的完整日历JS包装时间
- 如何制作href链接和<李>在一个包装中
- jquery在元素中查找文本节点,并使用标记进行连接和包装
- 如何使用图表包装函数有条件地格式化谷歌可视化表单元格
- Cordova包装应用程序内部链接加载在应用程序中,外部链接加载在浏览器中
- 如何在每个动态创建的ImageButton周围包装超链接?Visual Studio
- 使用Javascript设置库中图像包装器的宽度
- 使用服务工作者动态缓存HTTP URL的包装器
- 如何使图像适合TD,而不需要包装在不同的屏幕分辨率上
- 将setTimeout()包装器实现为Element.prototype中的方法
- 如何在输入中选择的文本周围包装html标记
- 如何将每个快速 js 请求包装在域或 trycatch 中