Why do I get `TypeError: Cannot set property length of #<Map> which has only a getter` error?

Why do I get `TypeError: Cannot set property length of #<Map> which has only a getter` error?

我有一个我使用的 Nest 应用程序(除了其他东西)Fastify, MikroORM and nest-mqtt (actually using it from a fork 修复了 Nest 8)。

现在,问题在于同时使用 MikroORM 和 nest-mqtt:当两者都导入模块(MikroOrmModule.forRoot()MqttModule.forRoot())时,它会抛出以下错误:

TypeError: Cannot set property length of #<Map> which has only a getter
    at _clone (/home/ts/mikro-orm-nest-mqtt/node_modules/clone/clone.js:162:16)
    at _clone (/home/ts/mikro-orm-nest-mqtt/node_modules/clone/clone.js:162:18)
    at clone (/home/ts/mikro-orm-nest-mqtt/node_modules/clone/clone.js:202:10)
    at Function.copy (/home/ts/mikro-orm-nest-mqtt/node_modules/@mikro-orm/core/dist/utils/Utils.js:237:36)
    at MetadataDiscovery.discoverDirectories (/home/ts/mikro-orm-nest-mqtt/node_modules/@mikro-orm/core/dist/metadata/MetadataDiscovery.js:137:55)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at MetadataDiscovery.findEntities (/home/ts/mikro-orm-nest-mqtt/node_modules/@mikro-orm/core/dist/metadata/MetadataDiscovery.js:106:9)
    at MetadataDiscovery.discover (/home/ts/mikro-orm-nest-mqtt/node_modules/@mikro-orm/core/dist/metadata/MetadataDiscovery.js:53:9)
    at MikroORM.discoverEntities (/home/ts/mikro-orm-nest-mqtt/node_modules/@mikro-orm/core/dist/MikroORM.js:87:25)
    at Function.init (/home/ts/mikro-orm-nest-mqtt/node_modules/@mikro-orm/core/dist/MikroORM.js:42:9)

起初,我认为这是 clone (see this issue 中的一个错误,但是,当只有一个包(MikroORM 或 nest-mqtt)被导入到模块中时,它并没有失败。

我怀疑这两个包以某种方式相互 interact/conflict,但是,我迷路了。

Here你可以找到一个最小的复制品。使用 npm v8.1.2node v16.13.1 以及 node v17.2.0 进行了测试。另请注意,MQTT 是否实际上是 运行 并不重要。还可以根据需要更改 src/mikro-orm.config.ts 中的 MikroORM 配置。

另见 MikroORM 的 this discussion

@B4nan user at GitHub found the root of this issue: collections package patches some global Node objects like Map, Set, Array. The issue was already reported at mqttjs/MQTT.js#1392.

没有 collections 依赖的最后一个版本是 v4.2.8,没有它的最后一次提交是 8aa2f8d。我目前的解决方法是使用该版本,直到他们从依赖项中删除 collections

更新: 有一个新的 PR 应该删除 collections 依赖:mqttjs/MQTT.js#1396.

更新 2: PR 已经合并,mqtt@4.3.4 正在按预期工作。