Асинхронный 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"); } };