【发布时间】:2017-08-20 20:30:03
【问题描述】:
您好,我正在尝试观察集合的更改,并保存更改日志,我在创建集合后立即设置了观察,问题是,我不知道如何知道哪个用户进行了更改,我尝试将观察者放在发布方法上,但是当只完成一件事时它会生成多个观察者并在日志上创建许多条目,之后我将句柄保存给观察者以防止多个观察者,但没关系我登录的是哪个用户,日志以第一个订阅发布的用户的名义保存,我不想为每个用户创建一个观察者并动态删除观察者句柄,我很确定这在服务器上会非常激烈,必须有更好的方法。也许在客户端设置观察者?但我不希望客户端有权访问日志集合。
Products = new Mongo.Collection("products");
Log = new Mongo.Collection("log");
var initializing = true;
Products.find().observe({
added: function(newDocument) {
if (initializing) return;
//how to get user here?
Log.insert({
idUser: ???,
date: new Date(),
document: newDocument
});
}
});
initializing = false;
这是我的第一次尝试,这是我在发布时尝试的方式:
var productsObserveHandle;
Meteor.publish('products', function() {
var initializing = true;
if (!productsObserveHandle) {
productsObserveHandle = Products.find().observe( {
added: function (document) {
if (initializing) return;
var userProfile = Meteor.users.findOne({_id:this.userId}).profile;
Log.insert( {
idUser: this.userId,
userProfile: userProfile,
date: new Date(),
eventType: "added",
document: document
});
}.bind(this)
});
}
initializing = false;
...
});
这个几乎搞定了,但它总是将日志保存为同一个用户,无论我尝试了多少不同的用户,因为已经创建了观察者句柄。
更新:好的,我想我到了某个地方,我在收集订阅后在客户端设置了观察,然后所有观察方法added,changed,removed 调用流星方法,保存日志并通过Meteor.userId() 获取用户并且它可以工作,但现在的交易是,当您注销并登录时,minimongo 数据库会更新,但订阅是相同的(我在 Meteor.startup 上进行所有订阅,在客户端),所以我无法停止观察者并在更新后重新启动它,有没有办法知道 minimongo 何时因帐户更改而更新?我可以尝试在用户注销后删除观察者,并在登录后等待超时以再次设置观察者,但我发现这有风险,因为更新 minimongo 可能需要比我设置的超时更多的时间,并且最后插入可能会泄漏到更改日志。
【问题讨论】: