0.0.2 • Published 5 years ago

@golemio/golemio-errors v0.0.2

Weekly downloads
1
License
MIT
Repository
gitlab
Last release
5 years ago

Golemio Errors Library

Minimal package with custom Error class extending the native built-in JavaScript Error class, providing extra funcionality and more capabilities for error handling.

Trying to adhere to Node.js best practices.

Developed by http://operatorict.cz

Prerequisites

Installation

Install Node

Install all npm modules using command:

yarn

Compilation of typescript code

To compile typescript code into js one-time

yarn run build

or run this, to watch all changes

yarn run build-watch

from the application's root directory.

Usage

First, in your project folder create file .npmrc with connection to OICT private npm registry and then in your project's package.json set dependency to Errors

npm install golemio-errors --save

or

yarn add golemio-errors --save

Then import module, e.g.

import { CustomError } from "golemio-errors";

Our CustomError has:

  • whole stack trace of original Error
  • extends (thus is the type of) Error
  • extra info about origin class
  • extra info about error code
  • distinguishes between operational errors (application error, app knows how to handle it) and fatal errors (app should gracefully die)
  • string message (== only thing the native Error has)

You can use CustomError class as you would a standard JavaScript Error, you will just get additional info and more capabilities:

const found = await this.model.findOne(id);
if (!found ) {
    throw new CustomError("Id `" + id + "` not found", true, "MyModelClass", 404);
} 

you can add the underlying Error to get the whole stack trace:

try {
    const q = this.model.find("nonsense");
    return await q.exec();
} catch (err) {
    throw new CustomError("Database error", true, "MyModelClass", 500, err);
}

and the result you will get:

"MyModelClass" [500] Database error (ObjectParameterError: Parameter "filter" to find() must be an object, got nonsense)
CustomError: Database error
    at MyModel.<anonymous> ({path}\src\core\models\MyModel.ts:65:19)
    at Generator.throw (<anonymous>)
    at rejected ({path}\src\core\models\MyModel.ts:5:65)
    at process._tickCallback (internal/process/next_tick.js:68:7)

if you call .toString() on the error object in the error handler (or if you use our ErrorHandler class).

You can import the error handler function:

import { handleError } from "golemio-errors";

The handle function provides a central point for error handling in your application. It logs the error, kills the application if it's unknown non-operational (programmer) error. Returns "API response ready" object if it's a known operational error with one of the standard HTTP codes.

You can use it:

try {
    await functionThatThrowsCustomError();      // Can throw our CustomError class
    await jsBuiltInFunction();                  // Can throw a native built-in JavaScript Error
} catch (err) {                                 // Catches everything
    handleError(err);                           // Handles everything
}

or for example in Express error handler route

// Error handler to catch all errors sent by routers (propagated through next(err))
this.express.use((err: any, req: Request, res: Response, next: NextFunction) => {
    handleError(err).then((error) => {
        if (error) {
            log.silly("Error caught by the router error handler.");
            res.status(error.error_status || 500).send(error);
        }
    });
});

and the result can be i.e.:

{ 
    error_message: "Not Found.", 
    error_status: 404 
}

or in development environment (NODE_ENV set to "development"):

{
    "error_message": "Not Found.",
    "error_status": 404,
    "stack_trace": "CustomError: Id `nonsense` not found\n    
    at MyModel.<anonymous> ({path}y\\dist\\core\\models\\MyModel.js:116:23)\n    
    at Generator.next (<anonymous>)\n
    at fulfilled ({path}\\dist\\core\\models\\MyModel.js:4:58)\n    
    at process._tickCallback (internal/process/next_tick.js:68:7)"
}

Logging

Logging uses Winston for standard logging with levels and debug (https://www.npmjs.com/package/debug) for debugging.

All logs with silly and debug level are printed as standard log (if appropriate log level is set) using Winston as well as using debug module with "golemio:errors" settings.

You can set both LOG_LEVEL and DEBUG settings in ENV variables.

Documentation

For generating documentation run yarn run generate-docs. TypeDoc source code documentation is located in docs/typedoc.

Contribution guidelines

Please read CONTRIBUTING.md.

Troubleshooting

Contact benak@operatorict.cz or vycpalek@operatorict.cz