Подтвердить что ты не робот

Как использовать домены Node.js 0.8.x с помощью выражения?

Как создать промежуточное программное обеспечение Express/Connect, которое обертывает каждый запрос в своем собственном домене?

4b9b3361

Ответ 1

Этот набор слайдов на колодере громкоговорителей дает краткий обзор:

Скопировать код промежуточного кода из слайдов:

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

Ответ 2

ОБНОВЛЕНИЕ: Описанный ниже подход был реализован в 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);
});

Вы можете не добавлять запрос и ответ в домен запроса, если вы вызываете http.createServer из домена верхнего уровня, но документы домена, похоже, указывают на то, что домены-запросы являются наилучшей практикой.

Обратите внимание, что приведенный выше код не выполняет никаких действий по очистке домена, таких как принудительное удаление домена запроса. Мое промежуточное программное обеспечение решает вместо этого передать ошибку через стек промежуточного программного обеспечения еще раз, чтобы позднее обрабатывать промежуточное программное обеспечение для обработки ошибок. YMMV.

Ответ 3

Мне посчастливилось заменить запас

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 или добавить дополнительную обработку ошибок.

Ответ 4

Это поздний ответ, но ознакомьтесь с модулем express-domain-moddleware. Он автоматически создает новый домен для каждого запроса. На активный домен можно ссылаться на 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.");
      }));
    }));
  }));
});

Ответ 5

Домены в настоящее время не рекомендуются в node:

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

В целях "ошибок зонирования" я создал библиотеку, которая позволяет вам написать асинхронный код в хорошем виде: https://github.com/vacuumlabs/yacol. Одно из преимуществ заключается в том, что вы можете иметь поведение, подобное доменам, с очень хорошей семантикой; проверьте это!