如何为不同的 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/) 实例之前它运行良好。两个manager
的middlewares
好像互相污染了
所以,我创建了一个简单的测试来验证假设。
这是测试:
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
。可能是 monk 的开发者实现了 singleton
模式。
我的问题是:我怎样才能让 softDb
和 db
有不同的 middlewares
集?
提前致谢。
我找到了解决方法。这不是官方批准的解决方案,我仍在寻找更好的解决方案。所以,如果你们中有人找到更好的解决方案,我会批准你的回答。
由于 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`
需要注意的是,你必须在创建管理器实例后立即复制中间件。
我知道有些人可能不喜欢这个解决方案。因此,与其否决这个答案,不如提供更好的解决方案。
我正在使用 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/) 实例之前它运行良好。两个manager
的middlewares
好像互相污染了
所以,我创建了一个简单的测试来验证假设。 这是测试:
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
。可能是 monk 的开发者实现了 singleton
模式。
我的问题是:我怎样才能让 softDb
和 db
有不同的 middlewares
集?
提前致谢。
我找到了解决方法。这不是官方批准的解决方案,我仍在寻找更好的解决方案。所以,如果你们中有人找到更好的解决方案,我会批准你的回答。
由于 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`
需要注意的是,你必须在创建管理器实例后立即复制中间件。
我知道有些人可能不喜欢这个解决方案。因此,与其否决这个答案,不如提供更好的解决方案。