G. Deward
G. Deward

Reputation: 1592

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);

Upvotes: 11

Views: 20188

Answers (2)

slebetman
slebetman

Reputation: 114074

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.

Upvotes: 8

Guilherme Souza
Guilherme Souza

Reputation: 93

In nodeJS you should ever return your error in the first argument of your callbacks.

myFunctionThatDoesSomethingAsync (callback) {
  doSomethingAsync('asanas', function (){
    //do something 
    return callback(err,results)
  })
}

myFunctionThatDoesSomethingAsync(function (err,results) {
  if (!err)
    doSomethingWith(results)
})

read more: http://fredkschott.com/post/2014/03/understanding-error-first-callbacks-in-node-js/

Sorry I read your question again and ysing NodeJS HTTP response you should do something like:

res.writeHead(401, {'Content-Type': 'text/plain'});
res.end('Email address required'');

Upvotes: -1

Related Questions