Why does node.js not infect my errors?

var api_friends_helper = require('./helper.js'); try{ api_friends_helper.do_stuff(function(result){ console.log('success'); }; }catch(err){ console.log('caught error'); //this doesn't hit! } 

And inside do_stuff I have:

 function do_stuff(){ //If I put the throw here, it will catch it! insert_data('abc',function(){ throw new Error('haha'); }); } 

Why does he never log a "caught error"? Instead, it displays the stack trace and the error object on the screen:

 { stack: [Getter/Setter], arguments: undefined, type: undefined, message: 'haha' } Error: haha at /home/abc/kj/src/api/friends/helper.js:18:23 at /home/abc/kj/src/api/friends/db.js:44:13 at Query.<anonymous> (/home/abc/kj/src/node_modules/mysql/lib/client.js:108:11) at Query.emit (events.js:61:17) at Query._handlePacket (/home/abc/kj/src/node_modules/mysql/lib/query.js:51:14) at Client._handlePacket (/home/abc/kj/src/node_modules/mysql/lib/client.js:312:14) at Parser.<anonymous> (native) at Parser.emit (events.js:64:17) at /home/abc/kj/src/node_modules/mysql/lib/parser.js:71:14 at Parser.write (/home/abc/kj/src/node_modules/mysql/lib/parser.js:576:7) 

Note that if I set the RIGHT AFTER throw after do_stuff (), it will catch it.

How can I catch it even if I put it in another function?

+7
source share
1 answer

This is one of the disadvantages of using NodeJS. It basically has two error handling methods; One of them uses try / catch blocks and more, passing the first argument to each callback function as an error.

The problem is with the asynchronous event loop model. You can use the uncaughtException 'event to catch errors that were not caught, but it has become the usual programming paradigm in Node.JS to use the first argument of the callback function to show if there are any errors: (I have never used MySQL before with NodeJS, just making up a generic example)

 function getUser( username, callback ){ mysql.select("SELECT username from ...", function(err,result){ if( err != null ){ callback( err ); return; } callback( null, result[0]); }); } getUser("MyUser", function(err, user){ if( err != null ) console.log("Got error! ", err ); else console.log("Got user!"); }); 
+6
source

All Articles