【发布时间】:2012-10-30 16:25:09
【问题描述】:
我正在尝试在更新集合后运行某些插入语句。例如,如果用户将嵌入文档位置添加到他们的用户文档中,我还想将该嵌入文档插入到单独的位置集合中。有没有办法在服务器端执行此操作以保证操作运行?
【问题讨论】:
-
我知道您可以调用方法服务器端来执行更新和插入,但这会产生负面影响,即从我的理解中删除延迟补偿。
标签: meteor
我正在尝试在更新集合后运行某些插入语句。例如,如果用户将嵌入文档位置添加到他们的用户文档中,我还想将该嵌入文档插入到单独的位置集合中。有没有办法在服务器端执行此操作以保证操作运行?
【问题讨论】:
标签: meteor
如果你愿意使用我写的一些代码 (https://gist.github.com/matb33/5258260),你可以像这样挂钩:
编辑:代码现在是 https://github.com/matb33/meteor-collection-hooks 项目的一部分
var test = new Meteor.Collection("test");
if (Meteor.isServer) {
test.before("insert", function (userId, doc) {
doc.created = doc.created || Date.now();
});
test.before("update", function (userId, selector, modifier, options) {
if (!modifier.$set) modifier.$set = {};
modifier.$set.modified = Date.now();
});
test.after("update", function (userId, selector, modifier, options, previous) {
doSomething();
});
}
【讨论】:
您需要在方法中执行此操作。您可以通过实现客户端方法存根来保持延迟补偿:
在客户端调用方法定义了与关联的存根函数 同名的服务器方法。您不必为 如果你不想,你的方法。在这种情况下,方法调用只是 就像其他系统中的远程过程调用一样,你必须等待 从服务器获取结果。
如果你定义了一个存根,当客户端调用一个服务器方法时,它会 也并行运行它的存根。在客户端,a的返回值 存根被忽略。存根的运行是因为它们的副作用:它们是 旨在模拟服务器方法将执行的结果, 但无需等待往返延迟。如果存根抛出 异常会被记录到控制台。
在此处查看我的 Meteor 存根示例:https://stackoverflow.com/a/13145432/1029644
【讨论】: