Handle a few common cases when an HTTP request got an error.
JavaScript Makefile
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
test
.gitignore
.jscsrc
.npmignore
.travis.yml
History.md
LICENSE
Makefile
README.md
index.js
package.json

README.md

Handle HTTP Error

Build Status Coverage Status

Handle a few common cases when an HTTP request got an error.

How to use

// The module exports a builder function.
const buildHandler = require('handle-http-error');

// The builder can build an error handler. The `overrides` is an optional object, and if provided,
// will be merged into the result error instance, overriding any conflicts.
const handler = buildHandler(overrides);

// The handler is a function that can be used to parse HTTP responses or errors, and it will throw an
// HTTP error (with the module `http-errors`) if it sees an error or an HTTP response with status 4xx
// or 5xx. For examples (see the use cases and the tests for more complete examples):
handler(error);
handler(res, body);

// The handler can look into the arguments and try to find an object that looks like an error, and
// merge the attributes into the result error. For example this would throw an error with an attribute
// `code: 40400`:
handler(res, { error: { statusCode: 404, code: 40400, message: '404 Not Found' } });

Use cases

Request + Bluebird

const request = require('request').defaults({ json: true });
require('bluebird').promisifyAll(request, { multiArgs: true });

const handler = require('handle-http-error')({
  type: 'application'
});

// When it responses 2xx.
request.getAsync(someUrl).spread(handler).spread((res, body) => {
  // ...
});

// When it responses 404.
request.getAsync(someUrl).spread(handler).then(() => {
  throw new Error('expected an error');
}, (err) => {
  err.should.be.Error();
  err.should.have.property('statusCode', 404);
  err.should.have.property('message', '404 Not Found');
  err.should.have.property('type', 'application');
});

// When it responses 404 and custom informations with HTML body (like `{ error: { statusCode: 404,
// code: 40400, message: '404 Not Found' } }`).
return request.getAsync(someUrl).spread(handler).then(() => {
  throw new Error('expected an error');
}, (err) => {
  err.should.be.Error();
  err.should.have.property('statusCode', 404);
  err.should.have.property('code', 40400);
  err.should.have.property('message', '404 Not Found');
  err.should.have.property('type', 'application');
});