我正在使用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/)实例之前,它很有效。两个middlewares
中的manager
似乎相互制约。
因此,我创建了一个简单的测试,以确保假设。 这是测试:
let db = monk('mongodb://localhost/test')
let softDb = monk('mongodb://localhost/other')
console.error(db._collectionOptions.middlewares === softDb._collectionOptions.middlewares)
正如我先前的假设,它产生true
。虽然db
和softDb
是不同的对象,但它们似乎共享相同的_collectionOptions.middlewares
。可能是和尚的开发者实施singleton
模式。
我的问题是:我怎样才能使softDb
和db
具有不同的middlewares
?
提前致谢。
答案 0 :(得分:0)
我找到了解决方法。这不是官方认可的解决方案,我仍在寻求更好的解决方案。所以,如果你们中的任何人找到了更好的解决方案,我会批准你的答案。
由于softDb
和db
共享同一组中间件,因此我深度克隆并重新分配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`
请务必注意,您必须在创建管理器实例后立即复制中间件。
我知道有些人可能讨厌这个解决方案。因此,请提供更好的解决方案,而不是对此答案进行投票。