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

时间:2017-10-30 18:21:07

标签: node.js mongodb monk

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

Monk有middleware机制,我们只需调用addMiddleware即可根据需要添加任意数量的中间件(https://automattic.github.io/monk/docs/middlewares.html

在我创建两个managerhttps://automattic.github.io/monk/docs/manager/)实例之前,它很有效。两个middlewares中的manager似乎相互制约。

因此,我创建了一个简单的测试,以确保假设。 这是测试:

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

正如我先前的假设,它产生true。虽然dbsoftDb是不同的对象,但它们似乎共享相同的_collectionOptions.middlewares。可能是和尚的开发者实施singleton模式。

我的问题是:我怎样才能使softDbdb具有不同的middlewares

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

由于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`

请务必注意,您必须在创建管理器实例后立即复制中间件。

我知道有些人可能讨厌这个解决方案。因此,请提供更好的解决方案,而不是对此答案进行投票。