From 01201c663df9f99d183ee28cf530c8f3df403dc5 Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Tue, 6 Dec 2022 22:10:08 +0800 Subject: [PATCH 1/4] feat: enable asyncLocalStorage by default https://github.com/koajs/koa/pull/1721 --- .github/workflows/nodejs.yml | 2 +- benchmark/middleware/README.md | 56 +++++++++++++++++++ lib/egg.js | 4 +- lib/lifecycle.js | 4 +- lib/utils/timing.js | 1 - package.json | 4 +- test/asyncLocalStorage.test.js | 28 ++++++++++ test/fixtures/egg/app/middleware/status.js | 1 + test/fixtures/egg/node_modules/session/app.js | 12 ++++ .../session-cache-app/app/controller/home.js | 3 + test/fixtures/session-cache-app/app/router.js | 3 + test/fixtures/session-cache-app/package.json | 3 + 12 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 test/asyncLocalStorage.test.js create mode 100644 test/fixtures/egg/node_modules/session/app.js create mode 100644 test/fixtures/session-cache-app/app/controller/home.js create mode 100644 test/fixtures/session-cache-app/app/router.js create mode 100644 test/fixtures/session-cache-app/package.json diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 8ea9a0b3..7654e6f4 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -22,7 +22,7 @@ jobs: strategy: fail-fast: false matrix: - node-version: [8, 10, 12, 14, 16] + node-version: [8, 10, 12, 14, 16, 18] os: [ubuntu-latest, windows-latest, macos-latest] steps: diff --git a/benchmark/middleware/README.md b/benchmark/middleware/README.md index af0bcd89..50a7e1df 100644 --- a/benchmark/middleware/README.md +++ b/benchmark/middleware/README.md @@ -29,3 +29,59 @@ Transfer/sec: 6.01MB ``` ![](https://user-images.githubusercontent.com/985607/32474444-2f4b7cde-c332-11e7-923f-8dfb709a7a24.png) + +### 2022-12-06 + +Enable asyncLocalStorage + +``` +v18.12.1 +server started at 7001 +------- generator middleware ------- +["generator middleware #1","generator middleware #2","generator middleware #3","generator middleware #4","generator middleware #5","generator middleware #6","generator middleware #7","generator middleware #8","generator middleware #9","generator middleware #10","generator middleware #11","generator middleware #12","generator middleware #13","generator middleware #14","generator middleware #15","generator middleware #16","generator middleware #17","generator middleware #18","generator middleware #19","generator middleware #20"] +Running 10s test @ http://127.0.0.1:7001/generator + 8 threads and 50 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 2.42ms 584.46us 12.20ms 94.43% + Req/Sec 2.50k 601.24 18.36k 97.63% + 198950 requests in 10.10s, 153.00MB read +Requests/sec: 19699.09 +Transfer/sec: 15.15MB +------- async middleware ------- +["async middleware #1","async middleware #2","async middleware #3","async middleware #4","async middleware #5","async middleware #6","async middleware #7","async middleware #8","async middleware #9","async middleware #10","async middleware #11","async middleware #12","async middleware #13","async middleware #14","async middleware #15","async middleware #16","async middleware #17","async middleware #18","async middleware #19","async middleware #20"] +Running 10s test @ http://127.0.0.1:7001/async + 8 threads and 50 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 1.97ms 1.58ms 43.26ms 96.10% + Req/Sec 3.23k 0.86k 24.84k 95.38% + 257959 requests in 10.10s, 179.02MB read +Requests/sec: 25533.50 +Transfer/sec: 17.72MB +``` + +Disable asyncLocalStorage + +``` +v18.12.1 +server started at 7001 +------- generator middleware ------- +["generator middleware #1","generator middleware #2","generator middleware #3","generator middleware #4","generator middleware #5","generator middleware #6","generator middleware #7","generator middleware #8","generator middleware #9","generator middleware #10","generator middleware #11","generator middleware #12","generator middleware #13","generator middleware #14","generator middleware #15","generator middleware #16","generator middleware #17","generator middleware #18","generator middleware #19","generator middleware #20"] +Running 10s test @ http://127.0.0.1:7001/generator + 8 threads and 50 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 2.22ms 1.18ms 38.70ms 93.88% + Req/Sec 2.79k 361.32 3.27k 85.50% + 222356 requests in 10.01s, 171.13MB read +Requests/sec: 22208.19 +Transfer/sec: 17.09MB +------- async middleware ------- +["async middleware #1","async middleware #2","async middleware #3","async middleware #4","async middleware #5","async middleware #6","async middleware #7","async middleware #8","async middleware #9","async middleware #10","async middleware #11","async middleware #12","async middleware #13","async middleware #14","async middleware #15","async middleware #16","async middleware #17","async middleware #18","async middleware #19","async middleware #20"] +Running 10s test @ http://127.0.0.1:7001/async + 8 threads and 50 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 1.71ms 0.98ms 33.63ms 94.19% + Req/Sec 3.60k 511.38 10.65k 91.28% + 288119 requests in 10.10s, 200.07MB read +Requests/sec: 28513.37 +Transfer/sec: 19.80MB +``` diff --git a/lib/egg.js b/lib/egg.js index a5b55b64..1f7898af 100644 --- a/lib/egg.js +++ b/lib/egg.js @@ -37,7 +37,9 @@ class EggCore extends KoaApplication { assert(fs.statSync(options.baseDir).isDirectory(), `Directory ${options.baseDir} is not a directory`); assert(options.type === 'application' || options.type === 'agent', 'options.type should be application or agent'); - super(); + // enable asyncLocalStorage by default + // https://github.com/koajs/koa/pull/1721 + super({ asyncLocalStorage: true }); this.timing = new Timing(); diff --git a/lib/lifecycle.js b/lib/lifecycle.js index b327000f..e44e15ee 100644 --- a/lib/lifecycle.js +++ b/lib/lifecycle.js @@ -6,6 +6,8 @@ const getReady = require('get-ready'); const { Ready } = require('ready-callback'); const { EventEmitter } = require('events'); const debug = require('debug')('egg-core:lifecycle'); +const utils = require('./utils'); + const INIT = Symbol('Lifycycle#init'); const INIT_READY = Symbol('Lifecycle#initReady'); const DELEGATE_READY_EVENT = Symbol('Lifecycle#delegateReadyEvent'); @@ -15,8 +17,6 @@ const IS_CLOSED = Symbol('Lifecycle#isClosed'); const BOOT_HOOKS = Symbol('Lifecycle#bootHooks'); const BOOTS = Symbol('Lifecycle#boots'); -const utils = require('./utils'); - class Lifecycle extends EventEmitter { /** diff --git a/lib/utils/timing.js b/lib/utils/timing.js index c1ae5512..64ac1d0b 100644 --- a/lib/utils/timing.js +++ b/lib/utils/timing.js @@ -4,7 +4,6 @@ const assert = require('assert'); const MAP = Symbol('Timing#map'); const LIST = Symbol('Timing#list'); - class Timing { constructor() { diff --git a/package.json b/package.json index a913bf7f..a07fe461 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ }, "ci": { "type": "github", - "version": "8, 10, 12, 14, 16", + "version": "8, 10, 12, 14, 16, 18", "afterScript": "after_success:\n - npminstall codecov && codecov --disable=gcov", "license": { "year": 2016 @@ -73,7 +73,7 @@ "get-ready": "^2.0.1", "globby": "^10.0.2", "is-type-of": "^1.2.1", - "koa": "^2.7.0", + "koa": "^2.14.0", "koa-convert": "^1.2.0", "node-homedir": "^1.1.1", "ready-callback": "^2.1.0", diff --git a/test/asyncLocalStorage.test.js b/test/asyncLocalStorage.test.js new file mode 100644 index 00000000..4712c3ec --- /dev/null +++ b/test/asyncLocalStorage.test.js @@ -0,0 +1,28 @@ +'use strict'; + +const assert = require('assert'); +const path = require('path'); +const request = require('supertest'); +const EggApplication = require('./fixtures/egg').Application; + +describe('test/asyncLocalStorage.test.js', () => { + let app; + before(() => { + app = new EggApplication({ + baseDir: path.join(__dirname, 'fixtures/session-cache-app'), + type: 'application', + }); + app.loader.loadAll(); + }); + + it('should start app with asyncLocalStorage = true by default', async () => { + assert(app.currentContext === undefined); + const res = await request(app.callback()) + .get('/'); + assert(res.status === 200); + console.log(res.body); + assert(res.body.sessionId === 'mock-session-id-123'); + assert(res.body.traceId); + assert(app.currentContext === undefined); + }); +}); diff --git a/test/fixtures/egg/app/middleware/status.js b/test/fixtures/egg/app/middleware/status.js index b80c8ee9..c69b13f5 100644 --- a/test/fixtures/egg/app/middleware/status.js +++ b/test/fixtures/egg/app/middleware/status.js @@ -2,6 +2,7 @@ module.exports = function() { return (ctx, next) => { + ctx.traceId = `trace:${Date.now()}`; if (ctx.path === '/status') { ctx.body = 'egg status'; return; diff --git a/test/fixtures/egg/node_modules/session/app.js b/test/fixtures/egg/node_modules/session/app.js new file mode 100644 index 00000000..f9887804 --- /dev/null +++ b/test/fixtures/egg/node_modules/session/app.js @@ -0,0 +1,12 @@ +module.exports = app => { + app.sessionCache = { + async getSessionById(sessionId) { + const ctx = app.currentContext; + console.log('[session.cache] getSessionById %s, traceId: %s', sessionId, ctx.traceId); + return { + sessionId, + traceId: ctx.traceId, + }; + }, + }; +}; diff --git a/test/fixtures/session-cache-app/app/controller/home.js b/test/fixtures/session-cache-app/app/controller/home.js new file mode 100644 index 00000000..ce50af3f --- /dev/null +++ b/test/fixtures/session-cache-app/app/controller/home.js @@ -0,0 +1,3 @@ +module.exports = async ctx => { + ctx.body = await ctx.app.sessionCache.getSessionById('mock-session-id-123'); +}; diff --git a/test/fixtures/session-cache-app/app/router.js b/test/fixtures/session-cache-app/app/router.js new file mode 100644 index 00000000..527e5369 --- /dev/null +++ b/test/fixtures/session-cache-app/app/router.js @@ -0,0 +1,3 @@ +module.exports = app => { + app.get('/', 'home'); +}; diff --git a/test/fixtures/session-cache-app/package.json b/test/fixtures/session-cache-app/package.json new file mode 100644 index 00000000..811756f2 --- /dev/null +++ b/test/fixtures/session-cache-app/package.json @@ -0,0 +1,3 @@ +{ + "name": "session-cache-app" +} From 7e17e146680cc566b1c34d1d42e36a1d06838da9 Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Tue, 6 Dec 2022 22:22:13 +0800 Subject: [PATCH 2/4] f --- benchmark/middleware/README.md | 92 +++++++++++++++++++ lib/egg.js | 3 +- test/asyncLocalStorage.test.js | 5 +- test/fixtures/egg/node_modules/session/app.js | 5 +- 4 files changed, 101 insertions(+), 4 deletions(-) diff --git a/benchmark/middleware/README.md b/benchmark/middleware/README.md index 50a7e1df..876efa80 100644 --- a/benchmark/middleware/README.md +++ b/benchmark/middleware/README.md @@ -57,6 +57,75 @@ Running 10s test @ http://127.0.0.1:7001/async 257959 requests in 10.10s, 179.02MB read Requests/sec: 25533.50 Transfer/sec: 17.72MB + +v16.18.1 +server started at 7001 +------- generator middleware ------- +["generator middleware #1","generator middleware #2","generator middleware #3","generator middleware #4","generator middleware #5","generator middleware #6","generator middleware #7","generator middleware #8","generator middleware #9","generator middleware #10","generator middleware #11","generator middleware #12","generator middleware #13","generator middleware #14","generator middleware #15","generator middleware #16","generator middleware #17","generator middleware #18","generator middleware #19","generator middleware #20"] +Running 10s test @ http://127.0.0.1:7001/generator + 8 threads and 50 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 2.53ms 1.21ms 36.34ms 93.77% + Req/Sec 2.44k 372.60 7.16k 91.78% + 194905 requests in 10.10s, 149.87MB read +Requests/sec: 19288.29 +Transfer/sec: 14.83MB +------- async middleware ------- +["async middleware #1","async middleware #2","async middleware #3","async middleware #4","async middleware #5","async middleware #6","async middleware #7","async middleware #8","async middleware #9","async middleware #10","async middleware #11","async middleware #12","async middleware #13","async middleware #14","async middleware #15","async middleware #16","async middleware #17","async middleware #18","async middleware #19","async middleware #20"] +Running 10s test @ http://127.0.0.1:7001/async + 8 threads and 50 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 1.76ms 405.33us 10.08ms 89.00% + Req/Sec 3.43k 264.17 5.94k 85.09% + 275242 requests in 10.10s, 191.08MB read +Requests/sec: 27242.76 +Transfer/sec: 18.91MB + +v14.21.1 +server started at 7001 +------- generator middleware ------- +["generator middleware #1","generator middleware #2","generator middleware #3","generator middleware #4","generator middleware #5","generator middleware #6","generator middleware #7","generator middleware #8","generator middleware #9","generator middleware #10","generator middleware #11","generator middleware #12","generator middleware #13","generator middleware #14","generator middleware #15","generator middleware #16","generator middleware #17","generator middleware #18","generator middleware #19","generator middleware #20"] +Running 10s test @ http://127.0.0.1:7001/generator + 8 threads and 50 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 4.16ms 2.46ms 39.16ms 91.43% + Req/Sec 1.55k 349.54 1.92k 84.88% + 123307 requests in 10.04s, 94.43MB read +Requests/sec: 12280.55 +Transfer/sec: 9.40MB +------- async middleware ------- +["async middleware #1","async middleware #2","async middleware #3","async middleware #4","async middleware #5","async middleware #6","async middleware #7","async middleware #8","async middleware #9","async middleware #10","async middleware #11","async middleware #12","async middleware #13","async middleware #14","async middleware #15","async middleware #16","async middleware #17","async middleware #18","async middleware #19","async middleware #20"] +Running 10s test @ http://127.0.0.1:7001/async + 8 threads and 50 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 2.88ms 1.38ms 24.43ms 93.97% + Req/Sec 2.19k 283.92 2.94k 85.25% + 174192 requests in 10.01s, 120.54MB read +Requests/sec: 17395.81 +Transfer/sec: 12.04MB + +v12.22.12 +server started at 7001 +------- generator middleware ------- +["generator middleware #1","generator middleware #2","generator middleware #3","generator middleware #4","generator middleware #5","generator middleware #6","generator middleware #7","generator middleware #8","generator middleware #9","generator middleware #10","generator middleware #11","generator middleware #12","generator middleware #13","generator middleware #14","generator middleware #15","generator middleware #16","generator middleware #17","generator middleware #18","generator middleware #19","generator middleware #20"] +Running 10s test @ http://127.0.0.1:7001/generator + 8 threads and 50 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 11.04ms 9.39ms 75.99ms 91.60% + Req/Sec 638.74 167.21 0.90k 63.25% + 50990 requests in 10.04s, 38.43MB read +Requests/sec: 5078.85 +Transfer/sec: 3.83MB +------- async middleware ------- +["async middleware #1","async middleware #2","async middleware #3","async middleware #4","async middleware #5","async middleware #6","async middleware #7","async middleware #8","async middleware #9","async middleware #10","async middleware #11","async middleware #12","async middleware #13","async middleware #14","async middleware #15","async middleware #16","async middleware #17","async middleware #18","async middleware #19","async middleware #20"] +Running 10s test @ http://127.0.0.1:7001/async + 8 threads and 50 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 7.45ms 7.68ms 69.86ms 93.04% + Req/Sec 1.00k 195.80 1.26k 74.50% + 80059 requests in 10.03s, 54.83MB read +Requests/sec: 7981.39 +Transfer/sec: 5.47MB ``` Disable asyncLocalStorage @@ -84,4 +153,27 @@ Running 10s test @ http://127.0.0.1:7001/async 288119 requests in 10.10s, 200.07MB read Requests/sec: 28513.37 Transfer/sec: 19.80MB + +v8.17.0 +server started at 7001 +------- generator middleware ------- +["generator middleware #1","generator middleware #2","generator middleware #3","generator middleware #4","generator middleware #5","generator middleware #6","generator middleware #7","generator middleware #8","generator middleware #9","generator middleware #10","generator middleware #11","generator middleware #12","generator middleware #13","generator middleware #14","generator middleware #15","generator middleware #16","generator middleware #17","generator middleware #18","generator middleware #19","generator middleware #20"] +Running 10s test @ http://127.0.0.1:7001/generator + 8 threads and 50 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 4.10ms 2.11ms 29.73ms 93.47% + Req/Sec 1.53k 241.05 3.74k 84.43% + 122526 requests in 10.11s, 91.14MB read +Requests/sec: 12123.93 +Transfer/sec: 9.02MB +------- async middleware ------- +["async middleware #1","async middleware #2","async middleware #3","async middleware #4","async middleware #5","async middleware #6","async middleware #7","async middleware #8","async middleware #9","async middleware #10","async middleware #11","async middleware #12","async middleware #13","async middleware #14","async middleware #15","async middleware #16","async middleware #17","async middleware #18","async middleware #19","async middleware #20"] +Running 10s test @ http://127.0.0.1:7001/async + 8 threads and 50 connections + Thread Stats Avg Stdev Max +/- Stdev + Latency 3.66ms 4.33ms 86.07ms 96.97% + Req/Sec 1.89k 296.76 2.24k 86.50% + 151007 requests in 10.04s, 101.04MB read +Requests/sec: 15046.06 +Transfer/sec: 10.07MB ``` diff --git a/lib/egg.js b/lib/egg.js index 1f7898af..af4709fe 100644 --- a/lib/egg.js +++ b/lib/egg.js @@ -12,6 +12,7 @@ const utils = require('./utils'); const Router = require('@eggjs/router').EggRouter; const Timing = require('./utils/timing'); const Lifecycle = require('./lifecycle'); +const enableAsyncLocalStorage = !!require('async_hooks').AsyncLocalStorage; const DEPRECATE = Symbol('EggCore#deprecate'); const ROUTER = Symbol('EggCore#router'); @@ -39,7 +40,7 @@ class EggCore extends KoaApplication { // enable asyncLocalStorage by default // https://github.com/koajs/koa/pull/1721 - super({ asyncLocalStorage: true }); + super({ asyncLocalStorage: enableAsyncLocalStorage }); this.timing = new Timing(); diff --git a/test/asyncLocalStorage.test.js b/test/asyncLocalStorage.test.js index 4712c3ec..87d334f3 100644 --- a/test/asyncLocalStorage.test.js +++ b/test/asyncLocalStorage.test.js @@ -3,6 +3,7 @@ const assert = require('assert'); const path = require('path'); const request = require('supertest'); +const enableAsyncLocalStorage = !!require('async_hooks').AsyncLocalStorage; const EggApplication = require('./fixtures/egg').Application; describe('test/asyncLocalStorage.test.js', () => { @@ -22,7 +23,9 @@ describe('test/asyncLocalStorage.test.js', () => { assert(res.status === 200); console.log(res.body); assert(res.body.sessionId === 'mock-session-id-123'); - assert(res.body.traceId); + if (enableAsyncLocalStorage) { + assert(res.body.traceId); + } assert(app.currentContext === undefined); }); }); diff --git a/test/fixtures/egg/node_modules/session/app.js b/test/fixtures/egg/node_modules/session/app.js index f9887804..f65928b2 100644 --- a/test/fixtures/egg/node_modules/session/app.js +++ b/test/fixtures/egg/node_modules/session/app.js @@ -2,10 +2,11 @@ module.exports = app => { app.sessionCache = { async getSessionById(sessionId) { const ctx = app.currentContext; - console.log('[session.cache] getSessionById %s, traceId: %s', sessionId, ctx.traceId); + const traceId = ctx && ctx.traceId; + console.log('[session.cache] getSessionById %s, traceId: %s', sessionId, traceId); return { sessionId, - traceId: ctx.traceId, + traceId, }; }, }; From 259828b2e27f3e95a05ea6d276efd5e7e44953b9 Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Tue, 6 Dec 2022 22:31:28 +0800 Subject: [PATCH 3/4] f --- test/egg.test.js | 38 ++++++++++++----------- test/loader/mixin/load_middleware.test.js | 2 +- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/test/egg.test.js b/test/egg.test.js index 55ed8174..b5be7c41 100644 --- a/test/egg.test.js +++ b/test/egg.test.js @@ -466,7 +466,7 @@ describe('test/egg.test.js', () => { after(() => app && app.close()); describe('app', () => { - it('should get timing', function* () { + it('should get timing', async () => { app = utils.createApp('timing'); app.loader.loadPlugin(); app.loader.loadConfig(); @@ -477,10 +477,10 @@ describe('test/egg.test.js', () => { app.loader.loadMiddleware(); app.loader.loadController(); app.loader.loadRouter(); - yield app.ready(); + await app.ready(); const json = app.timing.toJSON(); - assert(json.length === 27); + assert(json.length === 28); assert(json[1].name === 'Application Start'); assert(json[1].end - json[1].start === json[1].duration); @@ -500,30 +500,32 @@ describe('test/egg.test.js', () => { // loadCustomApp assert(json[11].name === 'Load app.js'); - assert(json[12].name === 'Require(6) app.js'); - assert(json[13].name === 'Before Start in app.js:6:9'); - assert(json[14].name === 'Before Start in mock Block'); - assert(json[15].name === 'readyCallback in mockReadyCallbackWithoutFunction'); + // test/fixtures/egg/node_modules/session/app.js + assert(json[12].name.startsWith('Require(6) ')); + assert(json[13].name === 'Require(7) app.js'); + assert(json[14].name === 'Before Start in app.js:6:9'); + assert(json[15].name === 'Before Start in mock Block'); + assert(json[16].name === 'readyCallback in mockReadyCallbackWithoutFunction'); - assert(json[16].name === 'Load "proxy" to Context'); - assert(json[17].name === 'Load Controller'); - assert(json[18].name === 'Load "controller" to Application'); + assert(json[17].name === 'Load "proxy" to Context'); + assert(json[18].name === 'Load Controller'); + assert(json[19].name === 'Load "controller" to Application'); // loadService - assert(json[19].name === 'Load Service'); - assert(json[20].name === 'Load "service" to Context'); + assert(json[20].name === 'Load Service'); + assert(json[21].name === 'Load "service" to Context'); // loadMiddleware - assert(json[21].name === 'Load Middleware'); - assert(json[22].name === 'Load "middlewares" to Application'); + assert(json[22].name === 'Load Middleware'); + assert(json[23].name === 'Load "middlewares" to Application'); // loadController - assert(json[23].name === 'Load Controller'); - assert(json[24].name === 'Load "controller" to Application'); + assert(json[24].name === 'Load Controller'); + assert(json[25].name === 'Load "controller" to Application'); // loadRouter - assert(json[25].name === 'Load Router'); - assert(json[26].name === 'Require(7) app/router.js'); + assert(json[26].name === 'Load Router'); + assert(json[27].name === 'Require(8) app/router.js'); }); }); diff --git a/test/loader/mixin/load_middleware.test.js b/test/loader/mixin/load_middleware.test.js index 1223aee8..dc0a9dea 100644 --- a/test/loader/mixin/load_middleware.test.js +++ b/test/loader/mixin/load_middleware.test.js @@ -37,7 +37,7 @@ describe('test/loader/mixin/load_middleware.test.js', function() { for (const mw of app.middleware) { assert(typeof mw === 'function'); } - assert(Object.keys(app.middleware).length === 3); + assert(Object.keys(app.middleware).length === 4); }); it('should override middlewares of plugin by framework', async () => { From 798d976017a510d155344b0a03d407ce615f20cf Mon Sep 17 00:00:00 2001 From: fengmk2 Date: Tue, 6 Dec 2022 22:37:52 +0800 Subject: [PATCH 4/4] f --- test/loader/mixin/load_middleware.test.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/loader/mixin/load_middleware.test.js b/test/loader/mixin/load_middleware.test.js index dc0a9dea..8b650aa1 100644 --- a/test/loader/mixin/load_middleware.test.js +++ b/test/loader/mixin/load_middleware.test.js @@ -3,6 +3,7 @@ const path = require('path'); const assert = require('assert'); const request = require('supertest'); +const enableAsyncLocalStorage = !!require('async_hooks').AsyncLocalStorage; const utils = require('../../utils'); describe('test/loader/mixin/load_middleware.test.js', function() { @@ -37,7 +38,12 @@ describe('test/loader/mixin/load_middleware.test.js', function() { for (const mw of app.middleware) { assert(typeof mw === 'function'); } - assert(Object.keys(app.middleware).length === 4); + if (enableAsyncLocalStorage) { + // the first middleware is asyncCtxStorage + assert(Object.keys(app.middleware).length === 4); + } else { + assert(Object.keys(app.middleware).length === 3); + } }); it('should override middlewares of plugin by framework', async () => {