Node.js error handling through each layer

by spin_round_22   Last Updated October 19, 2019 19:05 PM

What is the best way to handle errors in a Node.js application. This might actually apply to any language, but I still don't understand how to do it correctly. The questions are always who handles the errors, does it make sense to continually throw to the top, and who logs what?

Let's take a simple example of a user system where you can retrieve users from a database and "log in" if credentials match.

Database layer

// connects to a mongo db 
class UserDatabase(){
   async getUser(filter){
       // this can throw if connection is dead
       let user = await this.collections.users.findOne(filter);
       return user;
   }
}

Application layer

// makes calls to the db class to "login" a user
class UserApp {
    async loginUser(email, password){
       let user = await this.db.getUser({email});
       if(!user){
           return false;
       }
       if(user.password === options.password){
           return true;
       }
    }
}

REST layer

// calls the API from REST calls
class UserRestApi {
    async loginUser(request, response){
        let result = await this.app.loginUser(request.body.email, request.body.password);
        if(result){
            response.status = 200;
        }
        else {
            response.status = 401;
        }
        response.end();
    }
}

At this moment there is 0 error handling. We can fail almost everywhere with uncaught exceptions. But is there ever any point in catching at the lowest level? Suppose getUser() fails because the mongodb connection dies. I can catch it and log it there, but then do I throw it again, and again, and again, and log it again, and again, and again? Does that make sense? I would end up in this case with 2-3 repeated logs.

I'm just not sure how to approach this.



Related Questions


Updated July 25, 2016 08:02 AM

Updated April 08, 2015 00:02 AM

Updated January 16, 2018 19:05 PM

Updated October 09, 2018 14:05 PM

Updated June 18, 2019 03:05 AM