From 812c353a42af898618b90838d1a7d88668cdfb2c Mon Sep 17 00:00:00 2001 From: Alejandro Torrado Date: Thu, 18 Dec 2014 18:30:36 -0300 Subject: [PATCH] Capture work function exceptions and fill callbacks accordingly --- lib/caching.js | 15 +++++++++++---- lib/multi_caching.js | 20 +++++++++++--------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/lib/caching.js b/lib/caching.js index ac8e372..70d53e8 100644 --- a/lib/caching.js +++ b/lib/caching.js @@ -1,4 +1,6 @@ /*jshint maxcomplexity:15*/ +var domain = require('domain'); + var caching = function (args) { args = args || {}; var self = {}; @@ -47,8 +49,8 @@ var caching = function (args) { self.queues[key] = [cb]; - function fillCallbacks(err, data) { - self.queues[key].forEach(function(f) { + function fillCallbacks(err, data){ + self.queues[key].forEach(function(f){ f(err, data); }); delete self.queues[key]; @@ -60,7 +62,12 @@ var caching = function (args) { } else if (result) { fillCallbacks(null, result); } else { - work(function (err, data) { + domain + .create() + .on('error', function(err){ + fillCallbacks(err); + }) + .bind(work)(function (err, data) { if (err) { fillCallbacks(err); return; @@ -69,7 +76,7 @@ var caching = function (args) { if (err && (!self.ignoreCacheErrors)) { fillCallbacks(err); } else { - fillCallbacks(null, data); + fillCallbacks(err, data); } }); }); diff --git a/lib/multi_caching.js b/lib/multi_caching.js index fc83ac4..1e5a5bd 100644 --- a/lib/multi_caching.js +++ b/lib/multi_caching.js @@ -1,4 +1,5 @@ var async = require('async'); +var domain = require('domain'); /** * Module that lets you specify a hierarchy of caches. @@ -54,8 +55,8 @@ var multi_caching = function (caches) { self.queues[key] = [cb]; - function fillCallbacks(err, data) { - self.queues[key].forEach(function(f) { + function fillCallbacks(err, data){ + self.queues[key].forEach(function(f){ f(err, data); }); delete self.queues[key]; @@ -75,9 +76,14 @@ var multi_caching = function (caches) { fillCallbacks(err, result); }); } else { - work(function (err, data) { + domain + .create() + .on('error', function(err){ + fillCallbacks(err); + }) + .bind(work)(function (err, data) { if (err) { - fillCallbacks(err, null); + fillCallbacks(err, data); return; } var opts = { @@ -86,11 +92,7 @@ var multi_caching = function (caches) { ttl: ttl }; set_in_multiple_caches(caches, opts, function (err) { - if (err) { - fillCallbacks(err); - } else { - fillCallbacks(null, data); - } + fillCallbacks(null, data); }); }); }