流星。订阅/发布问题

时间:2015-09-11 18:17:49

标签: meteor

我有一个问题。 我正在尝试构建highcharts图形。 这个怎么运作: 我要去我的路线('ship.details'),这里我没有问题。 我的问题: subsription to(ships_snapshots_all)无法正常工作。 我的publish.js:

Meteor.publish("ships_snapshots", function(user, options) {
    if(!this.userId) return null;
    if(this.userId) {
        console.log('subsribed by ' + user);
        return ships_snapshots.find({userId: user}, options);
    }
});
Meteor.publish("ships_snapshots_all", function() {
    return ships_snapshots.find({});
})

我的subscribe.js(在lib文件夹中):

Meteor.subscribe('ships_snapshots');
Meteor.subscribe('ships_snapshots_all');

问题100%在我的subription中,因为如果我正在安装autopublish所有工作正常。我认为我的路由器存在问题。

router.js:

Router.route('/ships/details', {
    name: 'ship.details',
    loadingTemplate: 'loading',
    onBeforeAction: function() {
        var shipId = Session.get('currentShipId');
        if(!shipId) {
            Router.go('user.ships');
        } else {
            this.next();
        }
    },
    waitOn: function() {

        if (Meteor.isClient) {
        var getCompare = Meteor.user().profile.wows.compareWith;
        console.log(getCompare);
        var user2 = Meteor.users.findOne({"profile.wows.nickname": getCompare});
        var user2Id = user2._id;
        if (getCompare) {
            var user2 = Meteor.users.findOne({"profile.wows.nickname": getCompare});
            if (user2) {
                var user2Id = user2._id;
            }
        }
        if (getCompare) {
            var handle = Meteor.subscribe('ships_snapshots', Meteor.user()._id) && Meteor.subscribe('ships_snapshots', user2Id) && Meteor.subscribe('userSearchInfo', getCompare);
            Session.set('compareWith', user2);
            console.log('user2 _____');
            console.log(user2);
            return handle
        } else {
            var handle = Meteor.subscribe('ships_snapshots', Meteor.user()._id) && Meteor.subscribe('ships_snapshots', user2Id);
            return handle
        }
    }, data: function() {
            if (handle.ready()) {
            var shipname = this.params.shipName;
            var obj = {};

            var query = ships.findOne(); 
            var shipId = Session.get('currentShipId');
            var result;
            _.each(Meteor.user().profile.wows.ships, function(row) {
                if (row.ship_id === shipId) {
                    result = row;
                }
            });     
            return result;
        }
    }
});

我认为我在订阅ship_snapshots时遇到了问题。这里出了点问题,但我无法解决这个问题。

2 个答案:

答案 0 :(得分:1)

Meteor.publish("ships_snapshots", function(user, options) {
    if(!this.userId) return null;
    if(this.userId) {
        console.log('subsribed by ' + user);
        return ships_snapshots.find({userId: user._id}, options);
    }
});

在您的发布脚本中,用户真的是id还是用户对象?我把它改成了user._id。请检查一下。

答案 1 :(得分:1)

你究竟是什么意思"没有工作"?从您的代码中我会假设您总是看到所有的快照。

如果您在路由器中拥有订阅,则不应该在/ lib中拥有订阅。如果您在/ lib中有Meteor.subscribe('ships_snapshots_all');,那么您应该始终看到所有的快照(假设您并未在任何地方停止该订阅)。

此外,您对所有人的订阅应该是:

Meteor.publish("ships_snapshots", function(user, options) {
    if(this.userId) {
        console.log('subsribed by ' + user);
        return ships_snapshots.find({userId: user}, options);
    } else this.ready();
});

如果没有用户,您不想返回null,只需将订阅标记为就绪而不查找任何记录。这不是问题的原因,而只是良好的做法。