Works on Node.js version before 12. Currently not working on Node.js version 12.
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};
### 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 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()
});
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}}));
TBD
TBD
app.use(haven({handleGlobalErrors: false}));
app.use(haven({showStackTracesInResponse: false}));
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
};