Javascript Meteor.call和Meteor.publish:返回集合。正确查找
这是我目前拥有的一家酒吧:Javascript Meteor.call和Meteor.publish:返回集合。正确查找,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,这是我目前拥有的一家酒吧: Meteor.publish("searchResults", function (urlString) { check(urlString, String); Meteor.call('searchDatabase', urlString, function(error, result) { if(error) { return throwError(error.reason); }
Meteor.publish("searchResults", function (urlString) {
check(urlString, String);
Meteor.call('searchDatabase', urlString, function(error, result) {
if(error) {
return throwError(error.reason);
}
Session.set('searchData', result);
});
return [
Posts.find({_id: {$in: Session.get('searchData')}}),
Farmers.find({_id: {$in: Session.get('searchData')}})
];
});
我最初尝试这样做:
Meteor.publish("searchResults", function (urlString) {
check(urlString, String);
Meteor.call('searchDatabase', urlString, function(error, result) {
if(error) {
return throwError(error.reason);
}
return [
Posts.find({_id: {$in: Session.get('searchData')}}),
Farmers.find({_id: {$in: Session.get('searchData')}})
];
});
});
事实证明后者不会从pub方法返回。它只是从Meteor.call函数中返回,该函数返回未定义的
。但是,前者不断给我一个会话未定义的错误。我做错了什么/做这件事的正确方法是什么result
是一个数组,它具有集合中我需要显示的所有元素的\u id
提前感谢您的帮助 正如fuzzybabybunny所提到的,会话只在客户端上运行,因此您所采用的方法无法用于在服务器上运行的发布。发布中的方法调用是异步的,因此必须等待其结果,才能使用它返回数据库游标。尝试使用以下方法之一以同步方式使用异步调用。下面是一个例子:
当然还有其他方法,比如包中的Future类。会话只存在于客户端供参考。这就是它返回未定义的原因。您只能在客户端上分配会话变量。您还需要始终显示代码运行的位置frpm-服务器
,客户端
,一些常用文件夹?我刚刚意识到,如果出版物位于服务器上,那么我甚至需要执行Meteor.call吗?我可以在服务器端将Meteor方法设置为标准函数,然后直接在发布中调用它吗?或者这是不安全的?您是正确的,您实际上不需要调用方法(除非您也希望将其公开给客户端)。拥有一个普通函数并在出版物中直接调用它是完全安全的。