流星出版&订阅不使用选择器返回结果

时间:2016-06-27 17:12:39

标签: angularjs mongodb meteor angular-meteor

我有以下代码:

import { Meteor } from 'meteor/meteor';
import { Items } from './collection';

    if (Meteor.isServer) {
      Meteor.publish('items', function(options, owner) {

        let selector = {
          $and: [{ ownerId: owner}]
        }

        return Items.find(selector, options);

      });
    }

在客户端,我有:

this.subscribe('items', () => [{
      limit: this.getReactively('querylimit'),
      sort: {dateTime: -1}
    },
    this.getReactively('ownerId')
    ]);

以上不会返回任何结果。但是,当我将return语句更改为以下内容时,它可以正常工作!

return Items.find({ ownerId: '7QcWm55wGw69hpuy2' }, options); //works !!!

我对Mongo / Meteor查询选择器不是很熟悉。将查询作为变量传递给Items.find()似乎搞砸了一些东西。有人可以帮我解决这个问题!

由于

1 个答案:

答案 0 :(得分:0)

您正在尝试将函数作为选择器传递,这将无效。无法将函数序列化并从客户端发送到服务器。相反,您需要分别评估optionsowner。这是一个例子:

var owner = this.getReactively('ownerId');
var options = {
  limit: this.getReactively('querylimit'),
  sort: {dateTime: -1}
};

this.subscribe('items', options, owner);

请注意,发布的文档不会arrive in sorted order,因此,除非您使用limit,否则sort在此处无效。

另请注意,如果您需要在所有者或查询限制更改后重新运行订阅,则需要在autorun内进行订阅。

以下是改进实施的开始:

Meteor.publish('items', function(options, owner) {
  // DANGER! Actually check this against something safe!
  check(options, Object);

  // DANGER! Should any user subscribe for any owner's items?
  check(owner, Match.Maybe(String));

  // Publish the current user's items by default.
  if (!owner) {
    owner = this.userId;
  }

  return Items.find({ ownerId: owner }, options);
});