您好我正在尝试观察集合上的更改,并保存更改日志,我在创建集合后立即设置了观察,问题是,我无法弄清楚如何知道哪些用户进行了更改,我尝试将观察者放在发布方法上,但它生成了多个观察者,并且只做了一件事就在日志上创建了许多条目,之后我将句柄保存到观察者以防止多个观察者,但后来无所谓我登录的是什么用户,日志保存在第一个订阅发布的用户名中,我不想为每个用户创建一个观察者并动态删除观察者句柄,我很确定在服务器上会非常激烈,必须有更好的方法。也许在客户端设置观察者?但我不希望客户端有权访问日志集合。
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
,{{1}调用一个meteor方法,它保存日志并通过removed
获取用户并且它可以正常工作,但现在交易是,当您注销和登录时,minimongo数据库会更新,但订阅是相同的(我在Meteor.startup上进行所有订阅,在客户端),所以我无法阻止观察者并在更新后重新启动它,是否有办法知道由于帐户更改而何时更新了minimongo?我可以尝试在用户注销后删除观察者并在登录后等待超时再次设置观察者,但我发现这有风险,因为更新minimongo可能需要花费更多时间而不是我设置的超时,并且最后一次插入可能会泄漏到改变日志。
答案 0 :(得分:1)
这不会直接回答您的问题,而是提供替代解决方案。我经常在我的meteor应用程序中实现这种模式,我总是使用Collection Hooks包。
更具体地说,您可以使用.after.insert(userId, doc)
和.after.update(userId, doc, fieldNames, modifier, options)
方法。这两个都正确处理用户ID。
如果您不想使用包,那么您应该能够看到他们如何解决您的问题,因为需要使包工作。