-
Notifications
You must be signed in to change notification settings - Fork 89
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Context lost in an unhandled exception (or rejection) #48
Comments
express? you can use the express-async-errors to handle the unhandleRejection issue. const express = require('express');
require("express-async-errors");
const uuid = require('uuid');
const createNamespace = require('cls-hooked').createNamespace;
const namespace = createNamespace('com.foo');
const app = express();
app.use((req, res, next) => {
const tid = uuid.v4();
namespace.bindEmitter(req);
namespace.bindEmitter(res);
namespace.run(() => {
req.on('end', () => {
printContext("End Event");
});
namespace.set("url", req.url);
namespace.set("tid", tid);
next();
});
});
app.get('/normal', (req, res) => {
printContext();
res.send('ok');
});
app.get('/promise', async (req, res) => {
await asyncOperation();
printContext();
res.send('ok');
});
app.get('/exception', (req, res) => {
throw new Error('unhandle exception!');
});
app.get('/rejection', async (req, res) => {
throw new Error("unhandle rejection!");
});
app.use((err, req, res, next) => {
printContext("uncaughtException");
throw err;
});
function printContext(scienaro) {
const tid = namespace.get("tid");
const url = namespace.get("url");
console.log(`[${scienaro ? scienaro : url}]: ${tid}`);
}
function asyncOperation() {
return new Promise((resolve, reject) => {
printContext();
setTimeout(() => {
printContext();
resolve();
});
});
}
process.on("uncaughtException", (err) => {
console.trace(err);
});
process.on("unhandledRejection", (err) => {
console.trace(err);
});
app.listen(8586); |
I would strongly recommend against this module ( In express v4, a much better approach is to use something like https://github.com/express-promise-router/express-promise-router All that said, this is a bit off topic for this issue which is specifically about usage of this module. |
Thanks for your advise :) |
@ecdeveloper I hit this with a generic error being thrown so maybe it will help. But if you look in the code for
|
I have write a tidy npm package http-request-context to do this, using async_hooks, u can try it. |
First of all - great module!
I was wondering if there's any workaround to get the context, in case of an unhandled exception (or rejection, in case of promises). Here's a sample code:
The text was updated successfully, but these errors were encountered: