在Meteor.js中基于URL发布集合

时间:2014-02-25 23:41:09

标签: javascript coffeescript meteor iron-router

伪代码:

Meteor.publish 'stuff', ->
    if this.userId
        return doStuffForLoggedInUsers(this.userId)
    else if url matches '/some_url/:user_api_key'
        return doStuffForApiKey(apiKey)
    else
        return null

使用Iron Router的解决方案将是最佳的,但非路由框架解决方案也会有所帮助。

1 个答案:

答案 0 :(得分:2)

也许是这样的:

客户端

Router.map(function() {
  this.route('postsWithKey', {
    path: '/posts/:apiKey',
    template: 'posts',
    before: function() {
      this.subscribe('posts', this.params.apiKey);
    }
  });

  return this.route('posts', {
    before: function() {
      this.subscribe('posts');
    }
  });
});

服务器

Meteor.publish('posts', function(apiKey) {
  check(apiKey, Match.Optional(String));

  if (apiKey) {
    return Posts.find({key: apiKey});
  } else if (this.userId) {
    return Posts.find({owner: this.userId});
  }
});

当运行带有api密钥的路由时,客户端将使用密钥激活posts订阅。在服务器上,如果密钥存在,则返回一个游标,否则如果用户登录则返回不同的游标。您可以对密钥进行更复杂的验证 - 例如如果数据库中不存在错误,则抛出错误。