Skip to content

Express middleware - pin runtime errors to a request/response pair using domains. Helps avoid needlessly shutting down servers.

License

Notifications You must be signed in to change notification settings

ORESoftware/domain-haven

Repository files navigation

Domain-Haven

Caveat

Works on Node.js version before 12. Currently not working on Node.js version 12.

About

This is an awesome module for using Node.js domains to capture runtime errors and
pin errors / exceptions / unhandled-rejections to a particular request/response.

import * as express from 'express';
import haven from 'domain-haven';

const app = express();
app.use(haven());

export {app};

In Production

### use these env vars to switch off stack-traces from leaking sensitive data to client(s):

export NODE_ENV=prod
export NODE_ENV=production
export DOMAIN_HAVEN_PROD=true

alternatively, use this option to not reveal stack-traces programmatically:

import * as haven from 'domain-haven';

haven.middleware({
  opts: {
    revealStackTraces: false
  }
});

// where the above is equivalent to:

import haven from 'domain-haven';

haven({
  opts: {
    revealStackTraces: false
  }
});

In Production, continued:

In some rare cases, we may wish to enable stack traces shown to the client for a particular request. You can override behavior for a particular request by doing this:

app.use((req,res,next) => {
  if(req.query.secret === 'magic-spell'){  // you control this, serverside
    req.havenOpts = {revealStackTraces: true, overrideProd: true};
  }
  next()
});

Behavior

By default, if an uncaughtException or unhandledRejection occurs and a request/response pair can be
pinned to the event, a JSON error response will be sent. If the event cannot be pinned to
to a particular request/response, Haven will shutdown the process.


On the other hand, if the developer wants full control of what response to send, etc, use:

app.use(haven({opts:{auto:false}}));

Performance

TBD

Usage

TBD

If you just want to capture errors that don't make it to the global scope, use:

app.use(haven({handleGlobalErrors: false}));

To just show error messages, but not the full stack trace, use:

app.use(haven({showStackTracesInResponse: false}));

How it works:

What we do is use something similar to this beautiful piece of middleware:

const havenMiddleware = function (req, res, next) {
    
    const d = domain.create(); // create a new domain for this request
    
    res.once('finish', () => {
      d.exit();
    });
    
    d.once('error',  (e) => {
        res.status(500).json({error: e});
    });
    
    d.run(next);  // we invoke the next middleware
    
};

About

Express middleware - pin runtime errors to a request/response pair using domains. Helps avoid needlessly shutting down servers.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published