Iron-Router在Meteor中随机返回undefined

时间:2014-02-20 17:23:19

标签: javascript meteor iron-router

由于某些奇怪的原因,iron-router随机返回undefined。

this.route('pollyShow', {
    path: '/polly/:_id',
    template: 'polly_show',
    notFoundTemplate: 'notFound',
    before: function () {
        var id = this.params._id;
        var poll = Polls.findOne({_id: id});
        console.log(poll);
        var ip_array = poll.already_voted;
        $.getJSON("http://smart-ip.net/geoip-json?callback=?", function(data){
            ip_voted = ip_array.indexOf(data.host);

            if (ip_voted > -1) {
                Router.go('pollyResults', {_id: id});
            }
        });
    },
    data: function() {

        return Polls.findOne({_id: this.params._id});
    }
});

有时它正常返回,而有时它只返回undefined。

这背后有什么理由吗?

1 个答案:

答案 0 :(得分:0)

出现此问题是因为有时会填充Polly集合,而在路由执行时其他时间未填充。

在路由配置中使用waitOn选项显式waiting on a subscription可以防止出现此问题。


来自docs

  

默认情况下,新的Meteor应用程序包括autopublish和insecure软件包,它们共同模仿每个客户端对服务器数据库具有完全读/写访问权限的影响。这些是有用的原型设计工具,但通常不适合生产应用程序。准备好后,只需删除包。

要删除包裹,请致电meteor remove <package-name>

然后,您需要显式发布要在服务器上的客户端上看到的记录:

服务器/ publications.js

Meteor.publish('all_of_polly', function () { return Polls.find({}); });

在客户端订阅:

this.route('pollyShow', {
    path: '/polly/:_id',
    template: 'polly_show',
    notFoundTemplate: 'notFound',
    waitOn: function () { return Meteor.subscribe('all_of_polly'); }
    // ...
});