如何使用Express.js 0.8.x域名表达?

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)

  • 你测试过这个吗?它对我不起作用,domain.enter在节点的站点上没有记录. (4认同)
  • 我应该补充一点,我担心这段代码会调用domain.enter,但是没有相应的domain.exit.似乎可能是泄漏. (3认同)

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添加属性或添加其他错误处理.