Node.js Error Handling

I have the following code to insert data into DB - this code has to be executed in a sequential order

Router JS

module.exports = function(app) {

    app.get('/registerUser', function(req, res ) {

            objuser.userName  = 'testuser';
            objuser.password  = 'password';

            objuser.status  = true;

            registerUser (objuser ); //calls Business.js
            res.OK();
            res.end ();
    });
}

Business.js

var registerUser =  function (objuser  )
{


  userDB.registerUser (objuser ) ; //calls db.js

};

db.js

exports.registerUser  = function (objUser )
{

        var User = db.model(strCollectionName, UserSchema );

        var objSchema = new User(objUser);
        objSchema.save(function (err)
        {
            if (err)
               console.error (err);
            else
                console.log ("registerUser : Data insertion success.");

        });

}

In the db.js Im getting error from Mongo if I try to insert duplicate value. I wan to pass the error message to HTML page to display the same. What should I do? I tried

throw Error (err)

But it breaks the server.

Assuming you are using expressjs, I'd make use of the next callback. like so:

app.get('/registerUser', function (req, res, next) {
    objuser.userName  = 'testuser';
    objuser.password  = 'password';

    objuser.status  = true;

    registerUser(objuser, function (err) {
        if(err) {
            //this will be handled by express's errorHandler or whatever you have configured
            return next(err); 
        }
        //do whatever you want to do with the response
    });
});

If you don't want to make your Business.js call async then you will obviously change this code to a try...catch flow. Node.js apps are happier using async calls though, so a common convention in nodejs apps is to expose a callback using the (err, result) parameters. So your db.js call would be :

exports.registerUser  = function (objUser, callback )
{    
        var User = db.model(strCollectionName, UserSchema );
        var objSchema = new User(objUser);
        objSchema.save(function (err) {
            if (err) return callback(err);
            return callback(null, objSchema);

        });
}

By now you probably notice that your Business.js call would just be a mediator between your route and your db code...whether you need it or not is up to you.

HTH, Mike

If you are using node.js >= 0.8.x you can use connect-domain middleware that adds new domain functionality to your express/connect application. With doamin module you don't need to pass error up manually. You can simple throw error and it will be passed to error handler automatically.