// one: passes up the error from two() function one(cb){ two(function(err, data){ if(err) return cb('one ' + err); return cb(null, data); }); } // two: passes up the error from three() function two(cb){ three(function(err, data){ if(err) return cb('two ' + err); return cb(null, data); }); } // three: always returns an error function three(cb){ cb('three: something bad happened'); } // kick off one(), log the inevitable error with a simple function trace one(function(err, data){ if(err) { console.log(err); return; } }); // output: // one two three: something bad happened