流星发布和订阅不使用选择器返回结果
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() 似乎搞砸了。谁能帮我解决这个问题!
谢谢
您正试图将一个函数作为选择器传递,但这是行不通的。函数不能被序列化并从客户端发送到服务器。相反,您需要分别评估 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);
});
我有以下代码:
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() 似乎搞砸了。谁能帮我解决这个问题!
谢谢
您正试图将一个函数作为选择器传递,但这是行不通的。函数不能被序列化并从客户端发送到服务器。相反,您需要分别评估 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);
});