Comments (5)
I would strongly recommend against this module (express-async-errors
). Reaching deeply into the router like this is a bad idea, it will also not work in v5. The behavior you want is already added in v5 (pillarjs/router#47 & pillarjs/router@d2bce0c).
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.
from cls-hooked.
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);
from cls-hooked.
Thanks for your advise :)
from cls-hooked.
@ecdeveloper I hit this with a generic error being thrown so maybe it will help. But if you look in the code for run
it adds the context to a "symbol" in the error and throws it back up the chain
let context = this.createContext();
this.enter(context);
try {
if (DEBUG_CLS_HOOKED) {
const triggerId = async_hooks.triggerAsyncId();
const asyncHooksCurrentId = async_hooks.executionAsyncId();
const indentStr = ' '.repeat(this._indent < 0 ? 0 : this._indent);
debug2(`${indentStr}CONTEXT-RUN BEGIN: (${this.name}) currentUid:${currentUid} triggerId:${triggerId} asyncHooksCurrentId:${asyncHooksCurrentId} len:${this._set.length} context:${util.inspect(context)}`);
}
fn(context);
return context;
} catch (exception) {
if (exception) {
exception[ERROR_SYMBOL] = context;```
so i referenced it with `err[ERROR_SYMBOL]`
from cls-hooked.
I have write a tidy npm package http-request-context to do this, using async_hooks, u can try it.
from cls-hooked.
Related Issues (20)
- Context is lost when using Webpack HOT 2
- Experimental issue of Async-hooks in Nodejs docs. HOT 2
- Discussion: Porting to nodejs AsyncLocalStorage HOT 3
- Wrong metadata when a large number of requests take place HOT 1
- Can't get ctx when use await in async function. HOT 1
- Busy server hits RangeError HOT 1
- Context is preserved between two runPromise calls HOT 34
- Fails in Yarn PnP due to undeclared dependency on "stack-chain" HOT 2
- having issues on aws..
- [Memory leak] Context is not cleared if it references a Promise
- [Memory leak]The destroyNamespace method doesn't seem to work HOT 1
- _contextId: size keeps continuing to grow, even after destroying the namespace
- Lost context data using Typeorm logQuerySolw HOT 1
- When should runPromise exit context ? HOT 1
- Context lost after await when using debugger HOT 1
- I'm pushing cls-hooked alternative
- why is there no method to unset a key from context? Am i missing something?
- Cls-hooked destroyNameSpace not works as expected on dev server (Multi-tenant,Multi-User project using kubernets, Devops )
- Does it possible to update semver depcy from anything to 7.5.2? HOT 6
- turning listener off on bound EventEmitter does not work from inside the listener
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cls-hooked.