Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor.call和Meteor.publish:返回集合。正确查找_Javascript_Mongodb_Meteor - Fatal编程技术网

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方法设置为标准函数,然后直接在发布中调用它吗?或者这是不安全的?您是正确的,您实际上不需要调用方法(除非您也希望将其公开给客户端)。拥有一个普通函数并在出版物中直接调用它是完全安全的。