我有以下代码:
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()似乎搞砸了一些东西。有人可以帮我解决这个问题!
由于
答案 0 :(得分:0)
您正在尝试将函数作为选择器传递,这将无效。无法将函数序列化并从客户端发送到服务器。相反,您需要分别评估options
和owner
。这是一个例子:
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);
});