流星发布和订阅不使用选择器返回结果

Meteor Publish & Subscribe Not returning results using selector

我有以下代码:

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 语句更改为以下内容时,它起作用了!

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

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

谢谢

您正试图将一个函数作为选择器传递,但这是行不通的。函数不能被序列化并从客户端发送到服务器。相反,您需要分别评估 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);
});