Meteor.call和Meteor.publish:正确返回Collection.find

时间:2015-08-10 04:22:41

标签: javascript mongodb meteor

这是我现在的酒吧:

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函数,无论如何返回undefined。但是,前者不断给我Session is not defined错误。我做错了什么/完成这项工作的正确方法是什么? result是一个数组,其中包含我需要显示的集合中所有_id个元素。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

正如fuzzybabybunny所提到的,Sessions仅在客户端上运行,因此您所采用的方法不适用于在服务器上运行的发布。发布中的方法调用是异步调用,因此您必须等待其结果才能使用它来返回数据库游标。尝试使用其中一种方法以同步方式使用异步调用。这是一个例子:

Example on using npm module inside a Meteor method

当然还有其他方法,例如Fibers包中的Future类。