- Version: 15.5.0
- Platform: MacOS
- Subsystem: async_hooks
What steps will reproduce the bug?
I expected the following program to work:
import{AsyncLocalStorage}from'async_hooks'importassertfrom'assert'constasyncLocalStorage=newAsyncLocalStorage()// This section works nicely: the store is "stacked"asyncLocalStorage.run({depth: 1},()=>{assert.deepStrictEqual(asyncLocalStorage.getStore(),{depth: 1})asyncLocalStorage.run({depth: 2},()=>{assert.deepStrictEqual(asyncLocalStorage.getStore(),{depth: 2})})assert.deepStrictEqual(asyncLocalStorage.getStore(),{depth: 1})})// This section how when using enterWith/exit the store is not stackedasyncLocalStorage.enterWith({depth: 1})assert.deepStrictEqual(asyncLocalStorage.getStore(),{depth: 1})asyncLocalStorage.enterWith({depth: 2})assert.deepStrictEqual(asyncLocalStorage.getStore(),{depth: 2})asyncLocalStorage.exit(()=>{// **** this fails because the store returns undefinedassert.deepStrictEqual(asyncLocalStorage.getStore(),{depth: 1})asyncLocalStorage.exit(()=>{assert.deepStrictEqual(asyncLocalStorage.getStore(),undefined)})})assert.deepStrictEqual(asyncLocalStorage.getStore(),{depth: 2})But it fails in the line after the marked ****. The reason I expected it to work is because I assumed that enter/exit has the same "stacked" semantics as run, in that entering twice and exiting once will give me the store of the first enter. Unfortunately, the store I get after the first exit is undefined.
How often does it reproduce? Is there a required condition?
Consistent. Always.
What is the expected behavior?
The program should pass without error. See above for why.
What do you see instead?
A failure of the code:
node:internal/process/esm_loader:74
internalBinding('errors').triggerUncaughtException(
^
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ undefined
- {
- depth: 1
- }
at file:///Users/giltayar/code/mono/packages/request-id-logger-fastify-plugin/src/foo.js:26:10
at AsyncLocalStorage.exit (node:async_hooks:323:14)
at file:///Users/giltayar/code/mono/packages/request-id-logger-fastify-plugin/src/foo.js:24:19
at ModuleJob.run (node:internal/modules/esm/module_job:152:23)
at async Loader.import (node:internal/modules/esm/loader:166:24)
at async Object.loadESM (node:internal/process/esm_loader:68:5) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: undefined,
expected: { depth: 1 },
operator: 'deepStrictEqual'
}
Additional information
This also fails in v14.15.1
What steps will reproduce the bug?
I expected the following program to work:
But it fails in the line after the marked
****. The reason I expected it to work is because I assumed thatenter/exithas the same "stacked" semantics asrun, in that entering twice and exiting once will give me the store of the first enter. Unfortunately, the store I get after the firstexitisundefined.How often does it reproduce? Is there a required condition?
Consistent. Always.
What is the expected behavior?
The program should pass without error. See above for why.
What do you see instead?
A failure of the code:
Additional information
This also fails in v14.15.1