# Rest Api Errors for Nodejs

## What is this?
It's a set of errors that can be thrown to break a promise chain in a clean and logical way when creating APIs using NodeJS.
I created it because I like promises and I like rest and I like simple. 
It also keeps me from having to remember the right http status codes to return for various errors.

## How do I use it?

Here's an example of an endpoint to delete a Thang.

```Javascript
// delete a thang
app.delete('/thangs/:id', function (req, resp) {

    var username = req.user.username;
    var id = req.params.id;

    Thang.findOne({
        _id: id
    }).then(thang => {
        if (!thang) {
            // give em a 404 with custom error code and message
            throw new NotFoundError('thang_not_found', "I can't find that thang :(");
        } else if (thang.createdBy !== username) {
            // give em a generic 403
            throw new ForbiddenError();
        }
        // it's all good so actually delete the thang
        return Thang.deleteOne({
            _id: id
        });

    }).then(function () {

        resp.status(204).end();

    }).catch(function (err) {

        if(err instanceof ApiError) {
        
            // handle any ApiError with a simple elegant response
            resp.status(err.status).send({
                code: err.code,
                message: err.message
            });
        } else {
            // handle all other errors in some kinda way
            handleError(resp, err);
        }
    });
};
```

## What errors are supported?
 
All of following are implemented.  Throw them to your hearts content.
* **400** - BadRequest
* **401** - Unauthorized
* **402** - PaymentRequired
* **403** - Forbidden
* **404** - NotFound
* **405** - MethodNotAllowed
* **406** - NotAcceptable
* **407** - ProxyAuthenticationRequired
* **408** - RequestTimeout
* **409** - Conflict
* **410** - Gone
* **411** - LengthRequired
* **412** - PreconditionFailed
* **413** - RequestEntityTooLarge
* **414** - RequestUriTooLong
* **415** - UnsupportedMediaType
* **416** - RequestedRangeNotSatisfiable
* **417** - ExpectationFailed
* **418** - IAmATeapot
* **420** - EnhanceYourCalm
* **422** - UnprocessableEntity
* **423** - Locked
* **424** - FailedDependency
* **426** - UpgradeRequired
* **428** - PreconditionRequired
* **429** - TooManyRequests
* **431** - RequestHeaderFieldsTooLarge
* **444** - NoResponse
* **449** - RetryWith
* **450** - BlockedbyWindowsParentalControls
* **499** - ClientClosedRequest
* **500** - InternalServerError
* **501** - NotImplemented
* **502** - BadGateway
* **503** - ServiceUnavailable
* **504** - GatewayTimeout
* **505** - HTTPVersionNotSupported
* **506** - VariantAlsoNegotiates
* **507** - InsufficientStorage
* **508** - LoopDetected
* **509** - BandwidthLimitExceeded
* **510** - NotExtended
* **511** - NetworkAuthenticationRequired
* **598** - NetworkReadTimeout
* **599** - NetworkConnectTimeout
