Skip to content

cdimascio/wcp-errors

Repository files navigation

wcp-errors

Package for normalizing api errors using the following format:

Install

npm install wcp-errors

Usage

const { notFound } = require('wcp-errors');
badRequest('first name is required.');

Examples (ExpressJS)

app.get('/not_found', function(req, res, next) {
  next(notFound());
});

// Bad request example
app.get('/bad_request', function(req, res, next) {
  next(
    badRequest('Eek! A bad request', new Error(), {
      type: 'parameter',
      name: 'Eek',
    })
  );
});

app.get('/multiple_errors', function(req, res, next) {
  next(
    badRequest('Eek! A bad request').add({
      code: 'bad_request',
      message: ':-(',
    })
  );
});

// Throw! example
app.get('/throws', function(req, res, next) {
  throw new Error('Oh noes!');
});

// Error handler
app.use(function(err, req, res, next) {
  if (err instanceof ApiError) {
    res.status(err.statusCode).json(err);
  } else {
    res.status(500).json(internalServerError(err.message, err));
  }
});

Run the examples

  • cd example/express
  • npm install
  • npm start

Open a browser and try:

APIs

Basic

All basic Apis take the following three optional arguments:

  • message: a string describing the error
  • error: an Error object
  • target: an object with shape { type, name }

All APIs

badRequest();
conflict();
forbidden();
internalServerError();
methodNotAllowed();
notAcceptable();
notFound();
requestEntityTooLarge();
unAuthorized();
unsupportedMediaType();

Optionally, add additional errors to a wcp error

// Create an error and add additional error(s) to the wcp error
badRequest().add({
  code = 'validation_error', // optional
  message = 'last name required.', // optional
  target, // optional target
  error // optional error object
})

Raw

The raw API is only necessary in circumstances where the Basic are not sufficient.

 const { ApiError } = require('wcp-errors');

// Manually create a new API error
const e = new ApiError({
  statusCode: 409,
  code: 'conflict',
  message,
  error, // optional error
  target, // optional target
}).add({
  code = 'error', // optional
  message = 'unxepected error 1', // optional
  target, // optional target
  error // optional error object
}).add({
  code = 'error', // optional
  message = 'unxepected error 2', // optional
  target, // optional target
  error // optional error object
})

TODO

  • Create basic api functions for all http errors

  • Normalize basic apis with add api

  • Create dedicated Express middleware, such that a user does not have to write the fallback error handler middleware.

    ex:

    currently user's must create a fallback middleware similiar to the following

    app.use(function(err, req, res, next) {
      if (err instanceof ApiError) {
        res.status(err.statusCode).json(err);
      } else {
        res.status(500).json(internalServerError(err.message, err));
      }
    });

Contributers

Contributers are welcome! Please submit a PR.

License

MIT