【发布时间】:2020-12-01 23:00:58
【问题描述】:
我有一个包含字典的类 MongoQueryResolver:
private queries: {[key: string]: (params) => any} = {};
该字典按键保存函数,其中每个函数都是对 MongoDB 的查询函数。
我创建了一个装饰器MongoQuery,它代表一个mongo查询函数:
export function MongoQuery(queryName: string) {
return function decorator(target, key, func) {
target.register(queryName, func);
}
}
此装饰器调用MongoQueryResolver#register 以便在字典中注册查询,以便我可以通过查询名称使用它。
我创建的 MongoQuery 函数示例:
@MongoQuery(QueryType.GET_ALL_ENABLED)
public async getAllEnabled(params) {
const workersDb = MongoService.getBranch(Branches.WORKERS).db("workers");
const configCollection = await workersDb.collection('config');
const criteria: any = {isEnabled: true};
if (params.proxy) {
criteria.proxy = params.proxy;
}
return await configCollection.find(criteria).toArray();
}
以及我如何在外面使用它:
MyRoutes.get('/get-enabled', async (req, res) => {
const data = await MongoQueryResolver.resolve(QueryType.GET_ALL_ENABLED, {proxy: req.query.proxy});
res.json(data);
});
问题
当我的应用程序启动时,我会在现场打印字典:
set GET_ALL_ENABLED {
value: [Function: getAllEnabled],
writable: true,
enumerable: false,
configurable: true
}
{
GET_ALL_ENABLED: {
value: [Function: getAllEnabled],
writable: true,
enumerable: false,
configurable: true
}
}
但是当我开始使用字典时,它是空的..
我通过export default new MongoQueryResolver()将该类标记为单例
为什么会这样?好像是个新实例?
import MongoQueryResolver from '../../services/mongo/mongo-query-resolver'
【问题讨论】:
-
你能告诉我你是如何在路由文件中导入
MongoQueryResolver的吗?此外,使用这些export default new class通常不是一个好主意,因为这被认为是一种反模式。 read more here 和 here -
根据我的记忆编辑,现在没有这台电脑上的源代码,但这是主要思想,我只是想了解为什么它不能这样工作
-
你能说明
.register()和.resolve()是如何实现的吗?