Code Monkey home page Code Monkey logo

Comments (5)

wesleytodd avatar wesleytodd commented on July 17, 2024 2

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.

oneverest avatar oneverest commented on July 17, 2024

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.

oneverest avatar oneverest commented on July 17, 2024

Thanks for your advise :)

from cls-hooked.

bizob2828 avatar bizob2828 commented on July 17, 2024

@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.

zhujun24 avatar zhujun24 commented on July 17, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.