othiym23 / node-continuation-local-storage

implementation of https://github.com/joyent/node/issues/5243
BSD 2-Clause "Simplified" License
1.13k stars 207 forks source link

Session gets lost if nesting promises #116

Open alexandruluca opened 7 years ago

alexandruluca commented 7 years ago

I'm using this package to create a session for the current user so I can access session inside nested promises, including mongoose plugins and so on. For whatever reason, the namespace exists too quick and the session get's lost.

I debugged your code a little bit and I came up with this solution for my problem. In context.js line 44 in the Namespace.prototype.run method I patched it like this

Namespace.prototype.run = function (fn) {
  var context = this.createContext();
  this.enter(context);
  try {
    var contextFnResult = fn(context);
      return context;
  }
  catch (exception) {
    if (exception) {
      exception[ERROR_SYMBOL] = context;
    }
    this.exit(context);
    throw exception;
  }
  finally {
    context.res.on('finish', function() {
        this.exit(context);
    });
  }
};

Basically I simply exit the namespace on an error and always exit on response finish

context.res.on('finish', function() {
        this.exit(context);
    });

This way I am sure that my session is active untill I send back my response to the client

This works for me as intended. Are there any cons to this approach? Looking forward to your feedback

AleksMeshkov commented 7 years ago

Had to use almost the same approach.

https://github.com/AleksMeshkov/node-continuation-local-storage/commit/7eee8cf67a4c3f79ca69bd7b5246c183dbdaaedd

zsteinkamp commented 7 years ago

@AleksMeshkov have you opened a pull request? This will be a problem for anyone using CLS with express.

sonicoder86 commented 6 years ago

@othiym23 Do we need a test for @AleksMeshkov s fix in a pull request?

Qard commented 6 years ago

Have you tried using ns.bindEmitter(res)?

Seems likely there is a branch of the execution tree that CLS is not aware of, resulting in the tree resolving early and exiting when some activity is still pending. The most likely cause of that is event emitters as they are not patched automatically.