如何使用expression式来使用Node.js 0.8.x域?

如何创build将每个请求包装在自己的域中的Express / Connect中间件?

       

网上收集的解决方案 "如何使用expression式来使用Node.js 0.8.x域?"

Speaker Deck上的这组幻灯片提供了一个简洁的概述:

  • 节点0.8中的域

从幻灯片中显示中间件代码:

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(); }); 

更新:下面介绍的方法已经在连接域 NodeJS模块中实现,可以在Connect或Express应用程序中使用。

从Express 3开始, express.createServer已被弃用,其callback应转换为中间件。 在中间件中,将请求和结果对象添加到请求域是非常重要的,以便由它们触发的错误由域error handling程序处理。

我的中间件看起来像这样:

 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); }); 

如果您从顶级域中调用http.createServer ,则可以避免将请求和响应添加到请求域,但Domain文档似乎指示每个请求域是最佳实践。

请注意,上面的代码不会执行任何域清理操作,例如强制处置请求域。 我的中间件以后再select通过中间件堆栈来传递错误再由特定的error handling中间件来处理。 因人而异。

我已经很好运了,取代了股票

 var app = express.createServer(); 

有:

 var domainCreate = require('domain').create; var app = express.createServer(function (req, res, next) { var domain = domainCreate(); domain.run(next); }); 

然后在您的中间件中,您可以将属性添加到process.domain或添加其他error handling。

这是一个迟到的答案,但检查出express-domain-moddleware模块。 它会自动为每个请求创build一个新的域。 活动域可以由您的路由process.domain引用。 这里是一个例子:

 //with domain-middleware app.use(require('express-domain-middleware')); app.use(app.router); app.use(function errorHandler(err, req, res, next) { console.log('error on request %d %s %s: %j', process.domain.id, req.method, req.url, err); res.send(500, "Something bad happened. :("); if(err.domain) { //you should think about gracefully stopping & respawning your server //since an unhandled error might put your application into an unknown state } }); app.get('/error', function(req, res, next) { db.query('SELECT happiness()', process.domain.intercept(function(rows) { fs.readFile('asldkfjasdf', process.domain.intercept(function(contents) { process.nextTick(process.domain.intercept(function() { throw new Error("The individual request will be passed to the express error handler, and your application will keep running."); })); })); })); }); 

这些域目前在节点中已被弃用:

https://nodejs.org/api/domain.html

为了“分区错误”的目的,我创build了一个库,允许您以一种很好的方式编写asynchronous代码: https : //github.com/vacuumlabs/yacol 。 它的好处之一是,你可以有一个非常好的语义领域般的行为; 一探究竟!