context is lost in async waterfall in hapi
elgreatly opened this issue · comments
i'm creating a package and use cls-hooked to keep the request in the context in hapi.js
1- i created the function to start context
let createNamespace = require('cls-hooked').createNamespace;
const ns = createNamespace('test');
bindCurrentNamespace(req, reply) {
ns.bindEmitter(req);
ns.run(() => {
reply()
});
}
2- another functions to set and get value
setCurrentContext(req, reply) {
ns.set('test', 'test');
reply();
}
getCurrentContext() {
return ns.get('test');
}
when i'm using these functions in async waterfall i lost the context in the second callback
async.waterfall(
[
function(cb) {
getCurrentContext(); // return 'test'
getTest(cb);
},
function(testData, cb1) {
getCurrentContext(); // return undefined
getTest2(testData, (err, data) => {
callback(err, data);
});
}
],
callback
);
i tried to console the namespace to check if it keep the same namespace or not i checked it like that
let ns = getNamespace();
async.waterfall(
[
function(cb) {
console.log(ns);
getCurrentContext(); // return 'test'
getTest(cb);
},
function(testData, cb1) {
console.log(ns);
getCurrentContext(); // return undefined
getTest2(testData, (err, data) => {
callback(err, data);
});
}
],
callback
);
what i found is:
- first log i got the
ns
like that
Namespace {
name: 'request',
active: { _ns_name: 'request', id: 1096, 'test': 'test' },
_set: [ null ],
id: -1,
_contexts:
Map {
1120 => { _ns_name: 'request', id: 1096, 'test': 'test' },
1121 => { _ns_name: 'request', id: 1096, 'test': 'test' }
}
}
- second log i get the
ns
like that
Namespace {
name: 'request',
active: null,
_set: [],
id: -1,
_contexts: Map {},
_indent: 0
}
i found namespace.exit(context);
in line 412 in context.js file this line exit the context before the callback Done
but when i removed it all requests overwrite each other
anyone have idea how to fix this issue?
@Jeff-Lewis do you have idea why this issue happen?