Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to return HTTP error status code in Node?

What is the most efficient way to return an error number or error status code in JavaScript / NodeJS? For example, I would like to return a status code (or error code) of 401 in the following snippet:

var login = function (params, callback) {

    var email       = params.email || '',
        password    = params.password || '';

    if (!isValidEmail(email)) { 
        return callback(new Error('Email address required', 401)); 
    }

    // Do something else
};

The login method, above, would be called as follows:

authRouter.post('/login', function(req, res) {
   svc.login(req.body, function (err, response) {
       if (err) {
           err.statusCode = err.statusCode || 401;
           return res.status(err.statusCode).send({ message: err.message });
       } else {
           return res.send(response);
       }
   });
});

The goal here is to have the err.statusCode (or similar) set in the method and passed back via the callback. Basically, I'm looking for a shorthand version of this:

var err = new Error('Email address required');
err.statusCode = 401;
return callback(err);
like image 782
G. Deward Avatar asked Nov 06 '15 02:11

G. Deward


1 Answers

You can create your own error class for something like this. I've done something similar on several projects:

class HttpError extends Error {
    constructor (message, statusCode) {
        super(message);
        this.statusCode = statusCode;
    }
}

Now you can use it the way you expected it to work:

return callback(new HttpError('Email address required', 401)); 

Personally I prefer to create individual error types for the kinds of error my app use to make the code more readable. When you're in a rush, especially if you have junior developers working on your code, you will find that most people won't remember what 401 error is. I normally do something like this:

class UnauthorizedError extends Error {
    constructor (message) {
        super(message);
        this.statusCode = 401;
    }
}

class ForbiddenError extends Error {
    constructor (message) {
        super(message);
        this.statusCode = 403;
    }
}

class NotFoundError extends Error {
    constructor (message) {
        super(message);
        this.statusCode = 404;
    }
}

So I'd use them like this:

return callback(new UnauthorizedError('Email address required'));

IMHO this makes the code more readable and also makes the error codes self-documenting in the source code.

like image 186
slebetman Avatar answered Oct 04 '22 21:10

slebetman