【问题标题】:Consider Publish/Subscribe rules outside of templates (Meteor)考虑模板之外的发布/订阅规则 (Meteor)
【发布时间】:2015-05-26 09:14:36
【问题描述】:

我有一个应用程序,其中每个用户都有一个与之关联的 Counter 对象。用户订阅了相应的计数器。

每次用户提交表单时,我都想将用户计数器的当前值保存到表单中。但是,客户端和服务器在使用什么 Counter 对象上存在分歧。

Counters = new Mongo.Collection("counters");
Router.route('/register', { name: 'insertRegistration',
    waitOn: function() {
      return [ Meteor.subscribe('counters') ];
    },
});
RegistrationSchema = new SimpleSchema({
    somevalue: {
        type: String,
        autoValue: function() {
            console.log(Counters.findOne()); // Different results on client and server
            return "whatever";
        }
    }
});
if (Meteor.isServer) {
    Meteor.publish('counters', function() { 
        return Counters.find({ user_id: this.userId });
    });
}

客户端上的Counters.findOne() 选择与当前用户关联的 Counter 对象。 服务器上的Counters.findOne() 从所有 Counter 对象的集合中挑选一个 Counter 对象。

我认为这是因为客户端请求Counters 并获得它所订阅的内容,而服务器请求Counters 并获得集合。

有没有办法考虑服务器上的发布/订阅规则?

【问题讨论】:

    标签: meteor meteor-autoform


    【解决方案1】:

    在服务器上,做

    Counter.findOne({ user_id: this.userId }) 
    

    为用户获取正确的计数器。

    【讨论】:

    • 您的解决方案有效,但这会在两个地方重复规则。 (虽然,我想可能有一种方法可以抽象规则。)我有点希望有一种方法可以通过订阅/发布来实现这一点,但我想这种方式可以做到。 - 特别是如果这是唯一的方法。
    • 发布和订阅机制仅适用于客户端。在服务器上,访问不受限制,因此必须手动完成过滤。您在服务器上编写的任何处理任何类型 _id 的方法都需要客户端提供该 _id。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2017-11-30
    • 2013-11-18
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多