From 6cda3daaaecce896f9d74149d5eb1ecc32f8ecb5 Mon Sep 17 00:00:00 2001 From: YANG QIA <2013xile@gmail.com> Date: Thu, 28 Aug 2025 11:16:40 +0800 Subject: [PATCH] fix(collection-tree): remove event listeners after destroying tree collections (#7459) --- .../src/server/plugin.ts | 31 ++++++++++++------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/packages/plugins/@nocobase/plugin-collection-tree/src/server/plugin.ts b/packages/plugins/@nocobase/plugin-collection-tree/src/server/plugin.ts index 6eb7c63a18f..7296a69ee3a 100644 --- a/packages/plugins/@nocobase/plugin-collection-tree/src/server/plugin.ts +++ b/packages/plugins/@nocobase/plugin-collection-tree/src/server/plugin.ts @@ -113,21 +113,28 @@ class PluginCollectionTreeServer extends Plugin { throw new Error('Cannot set itself as the parent node'); } }); + + this.db.on('collections.afterDestroy', async (collection: Model, { transaction }) => { + const name = `main_${collection.get('name')}_path`; + if (!condition(collection.options)) { + return; + } + + const collectionTree = this.db.getCollection(name); + if (collectionTree) { + await this.db.getCollection(name).removeFromDb({ transaction }); + + collectionManager.db.removeAllListeners(`${collection.name}.afterSync`); + this.db.removeAllListeners(`${collection.name}.afterCreate`); + this.db.removeAllListeners(`${collection.name}.afterUpdate`); + this.db.removeAllListeners(`${collection.name}.afterBulkUpdate`); + this.db.removeAllListeners(`${collection.name}.afterDestroy`); + this.db.removeAllListeners(`${collection.name}.beforeSave`); + } + }); }); } }); - - this.db.on('collections.afterDestroy', async (collection: Model, { transaction }) => { - const name = `main_${collection.get('name')}_path`; - if (!condition(collection.options)) { - return; - } - - const collectionTree = this.db.getCollection(name); - if (collectionTree) { - await this.db.getCollection(name).removeFromDb({ transaction }); - } - }); } private async defineTreePathCollection(name: string, options: { schema?: string }) {