# fel

[![Greenkeeper badge](https://badges.greenkeeper.io/Springworks/fel.svg)](https://greenkeeper.io/)

Exports the `createError` function that creates an error.

The error has a unique id and a reference to the cause, this is to facilitate with logging.

`createError` uses [`boom.wrap`](https://github.com/hapijs/boom#wraperror-statuscode-message) to decorate the error with `boom` properties.

`createError` takes the following optional params:

- `code` HTTP status code >= 400. Defaults to 500.
- `message` Error message. Defaults to the default message for `code`.
- `cause` The cause of the error.
- `root_error_id` Id of the root cause. Defaults to `cause.root_error_id || error_id`.
- `stack_from` Function to start stack trace from. Defaults to `createError`.

The created error has the following properties added to it:

- `code` HTTP status code
- `message` Error message
- `cause` The cause
- `error_id` A unique id string
- `root_error_id` A unique id string
- `output` See boom
- `details` if `cause` is a [joi](https://github.com/hapijs/joi) error then the `details` array is copied. It is also added to `output.payload`.

**Example:**

```js
import { createError } from 'fel';

let error = createError();
// error.code == 500
// error.message == 'Internal Server Error'
// error.error_id == (unique id string)
// error.root_error_id == (unique id string)

createError({ code: 400 });
createError({ code: 400, message: 'cannot process the request' });

function readJsonFile(filename, callback) {
  fs.readFile(filename, { encoding: 'utf8' }, (err, str) => {
    if (err) {
      return callback(createError({ cause: err, message: 'Unable to read the file' }));
    }
    let obj;
    try {
      obj = JSON.parse(str);
    }
    catch (json_err) {
      return callback(createError({ cause: json_err, message: 'Unable to parse the file' }));
    }
    callback(null, obj);
  });
}
```
