domain-haven
TypeScript icon, indicating that this package has built-in type declarations

0.2.115 • Public • Published

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
    
};

Package Sidebar

Install

npm i domain-haven

Weekly Downloads

123

Version

0.2.115

License

MIT

Unpacked Size

20.6 kB

Total Files

8

Last publish

Collaborators

  • oresoftware