Meteor框架免费服务器崩溃

时间:2015-10-21 22:39:09

标签: javascript meteor

您好我刚刚学习了Meteor并开发了一款多人游戏。出于测试目的,我部署到免费服务器,每晚我们与一些朋友一起玩游戏,一般是20个在线人。但是,网站不时崩溃,没有数据进出。它冻结了。我检查了客户端日志和服务器日志,但没有任何内容。当我刷新页面时,它会在加载模板上冻结。

我在装载屏幕上使用铁路由器:

Router.configure({
  layoutTemplate: 'main',
  notFoundTemplate: 'notFound',
  loadingTemplate: 'loading'
});

Router.route('/loading', {
  template : 'loading'
});

Router.route('/', {
  template : 'home',
  waitOn: function() {
    return [Meteor.subscribe('chat'),Meteor.subscribe('games'),Meteor.subscribe('users')];
  },  
  data : function(){
    return {
      chat : Chat.find({},{sort: {createdAt: 1}}),
      games : Games.find({},{sort: {createdAt: -1}}),
      users : Meteor.users.find({},{sort : {"status.online":-1}})
    }
  }
});

我不知道这个问题。有时它会在主页面上冻结,有时会在游戏页面上冻结。对于游戏页面,我正在简化我的代码以供您理解。

游戏中有两个级别:白天和黑夜。它首先点击游戏创建者,早上开始倒计时。倒计时结束时,夜晚以相应的倒计时开始。它会继续循环直到游戏结束。在早上结束时,有一些游戏的计算,然后它切换到夜晚。夜也一样。

对于倒计时目的,我使用带有光纤的setTimeOut()函数。

Meteor.methods({
    startGame : function(id){
        //some other code here
        //....

        //set timestamp of the end date
        var currentDate = new Date();
        console.log("currentDate: "+currentDate);
        if(night){ var interval = durationNight;}
        else{ var interval = durationMorning;}
        console.log("interval: "+interval);
        var endDate = currentDate.setSeconds(currentDate.getSeconds() + interval);
        console.log("endDate: "+endDate);

        Games.update({"_id" : id}, {$set : {"endTime" : endDate}});


        endLevelInternal[id] = setTimeout(function () {
            // // completed
            Fiber(function() { 
                console.log(id +' countdown completed');

                endLevelFlag[id] = true;

                if(endLevelFlag[id]){
                    endLevelFlag[id] = false;
                    Meteor.call('endLevel', id, function(){
                        endLevelFlag[id] = true;
                    });
                }
            }).run();  

        }, interval*1000);
    },

    endLevel : function(){
        //some other code here
        //...

        //
        if(!finished){
            Meteor.call('startGame', id);   
        }
    }
});

Template.game.events({
    'click .startGame' : function(evt, template){
        var flag = true;
        if(flag){
            flag = false;
            Meteor.call('startGame', template.data._id, function(){
                flag = true;
            });
        }
    }
});

我不确定问题是由于服务器代码还是由于免费服务器(RAM或CPU)的限制。

2 个答案:

答案 0 :(得分:1)

我建议您查看Meteor日志,或者在生产就绪的其他平台上进行部署。 一种选择是使用Meteor Up的AWS或DigitalOcean。

答案 1 :(得分:0)

对于那些有同样问题的人。我刚刚将我的应用程序从免费服务器部署到Modulus,现在一切正常。所以它必须与Meteor免费服务器有关。