Асинхронный try..catch

npm i domain

Domain не сможет отловить ошибки, которые возникли в модулях, инициализированных вне контекста domain. К примеру модули подключаемые в начале модуля с помощью require() В большинстве случаев к таким модулям относятся модули работающие с внешними источниками данных. К примеру: mongodb, redis, mysql итд.

Для того чтоб домаин отлавливал все ошибки, все реализации приложений и библиотек должны происходить в его контексте те domain.run() или должны быть связаны методом domain.bind()

app.js

var domain = require('domain');
 
var serverDomain = domain.create(); // домен для ошибок, выпадающих из server.listen
 
serverDomain.on('error', function(err) {
  console.error("Серверная ошибка %s", err);
  process.exit(255);
});
 
serverDomain.run(function() {
 
    var http = require('http');
    var handler = require('./handler');
 
    var server = http.createServer(function(req, res) {
 
    var requestDomain = domain.create(); // домен для ошибок во время запроса
    requestDomain.add(req);
    requestDomain.add(res);
 
    requestDomain.on('error', function(err) {
        res.statusCode = 500;
        res.end(err.message);
        // ...
        serverDomain.emit('error', err);
    });
 
    requestDomain.run(function() {
        handler(req, res);
    });
    });
 
    server.listen(3000);
});

handler.js

var fs = require('fs');
 
module.exports = function handler(req, res) {
  if (req.url == '/') {
 
    fs.readFile('no-such-file', function(err, content) {
 
      if (err) throw err; // JSON.parse("invalid!")
 
      res.end(content);
    });
 
  } else {
    res.statusCode = 404;
    res.end("Not Found");
  }
 
};