如何为不同的 monk 的 Manager 实例实现不同的中间件?

How to implement different middlewares for different monk's Manager instance?

我正在使用 monk (https://automattic.github.io/monk/) 来进行 mongodb 数据操作。

Monk 有一个 middleware 机制,我们可以简单地调用 addMiddleware 来根据需要添加任意数量的中间件 (https://automattic.github.io/monk/docs/middlewares.html)

在我创建两个 manager (https://automattic.github.io/monk/docs/manager/) 实例之前它运行良好。两个managermiddlewares好像互相污染了

所以,我创建了一个简单的测试来验证假设。 这是测试:

  let db = monk('mongodb://localhost/test')
  let softDb = monk('mongodb://localhost/other')
  console.error(db._collectionOptions.middlewares === softDb._collectionOptions.middlewares)

正如我之前的假设,它产生 true。尽管 dbsoftDb 是不同的对象,但它们似乎共享相同的 _collectionOptions.middlewares。可能是 monk 的开发者实现了 singleton 模式。

我的问题是:我怎样才能让 softDbdb 有不同的 middlewares 集?

提前致谢。

我找到了解决方法。这不是官方批准的解决方案,我仍在寻找更好的解决方案。所以,如果你们中有人找到更好的解决方案,我会批准你的回答。

由于 softDbdb 共享同一组中间件,因此我深度克隆并重新分配 db._collectionOptions.middlewares。出于深度克隆的目的,我使用了这个包:https://www.npmjs.com/package/clone.

解决方案如下:

let clone = require('clone')

let db = monk('mongodb://localhost/test')
db._collectionOptions.middlewares = clone(db._collectionOptions.middlewares)

let softDb = monk('mongodb://localhost/other')
softDb._collectionOptions.middlewares = clone(softDb._collectionOptions.middlewares)

// Here I can add different set of middlewares to db and softDb
// The middlewares of both manager will be independent to each other

console.error(db._collectionOptions.middlewares === softDb._collectionOptions.middlewares)
// Now, this will yield `false`

需要注意的是,你必须在创建管理器实例后立即复制中间件。

我知道有些人可能不喜欢这个解决方案。因此,与其否决这个答案,不如提供更好的解决方案。