Raf*_*ota 21 node.js express node.js-domains
如何创建Express/Connect中间件,将每个请求包装在自己的域中?
Jon*_*nan 12
Speaker Deck上的这组幻灯片提供了简洁的概述:
从幻灯片中提取中间件代码:
var createDomain = require('domain').create;
app.use(function(req, res, next) {
var domain = createDomain();
domain.on('error', function(err) {
// alternative: next(err)
res.statusCode = 500;
res.end(err.message + '\n');
domain.dispose();
});
domain.enter();
next();
});
Run Code Online (Sandbox Code Playgroud)
Chr*_*rie 12
更新:下面描述的方法已在connect-domain NodeJS模块中实现,该模块可用于Connect或Express应用程序.
从Express 3开始,express.createServer不推荐使用,并且应将其回调转换为中间件.在中间件中,将请求和结果对象添加到请求域非常重要,以便由它们触发的错误由域错误处理程序处理.
我的中间件看起来像这样:
var domain = require('domain');
app.use(function(req, res, next) {
var requestDomain = domain.create();
requestDomain.add(req);
requestDomain.add(res);
requestDomain.on('error', next);
requestDomain.run(next);
});
Run Code Online (Sandbox Code Playgroud)
如果您http.createServer在顶级域中调用,则可以避免将请求和响应添加到请求域,但Domain文档似乎表明每个请求域是最佳做法.
请注意,上面的代码不执行任何域清理操作,例如强制处理请求域.我的中间件选择将错误再次通过中间件堆栈,以便稍后由特定的错误处理中间件处理.因人而异.
小智 5
我有幸运气取代股票
var app = express.createServer();
Run Code Online (Sandbox Code Playgroud)
有:
var domainCreate = require('domain').create;
var app = express.createServer(function (req, res, next) {
var domain = domainCreate();
domain.run(next);
});
Run Code Online (Sandbox Code Playgroud)
然后在中间件中,您可以向process.domain添加属性或添加其他错误处理.
| 归档时间: |
|
| 查看次数: |
9210 次 |
| 最近记录: |