页面重定向

时间:2017-03-04 00:00:28

标签: javascript mongodb session meteor

我制作的游戏需要玩家的游说,但没有帐号。有点像游戏,Spyfall。我正在使用Meteor Sessions来了解哪个玩家加入了大厅,以便我可以返回该特定玩家的正确数据。我有一个join.js组件,用户在其中输入大厅访问代码和用户名。该组件还将用户重定向到大厅。 Join.js在路线,/ join,并且大厅在路线,/:大厅。这是join.js handleSubmit方法,它接受用户输入并将其放入player集合中:

    handleSubmit(event) {
    event.preventDefault();
    var party = Players.findOne({code: this.refs.code.value});
    if(typeof party !== 'undefined') {
        Meteor.call('players.insert', this.refs.code.value, this.refs.name.value);
        var playerId = Players.findOne({"name": this.refs.name.value})._id;
        Meteor.call('players.current', playerId);
        location.href = "/" + this.refs.code.value;
    } else {
        document.getElementById("error").innerHTML = 'Please enter a valid party code';
    }

我在players.js集合中的Meteor.methods中使用Sessions来获取当前用户。

import { Mongo } from 'meteor/mongo';
import { Session } from 'meteor/session';

Meteor.methods({
    'players.insert': function(code, name) {
        console.log('adding player: ', name , code);
        Players.insert({code: code, name: name});
    },
    'players.updateAll': function(ids, characters, banners, countries, ancestors) {
        for (var i = 0; i < characters.length; i++){
            Players.update({_id: ids[i]}, {$set: {character: characters[i], banner: banners[i], country: countries[i], ancestor: ancestors[i]},});
        }
    },
    'players.current': function(playerId) {
            Session.set("currentPlayer", playerId);
            console.log(Session.get("currentPlayer"));
    },
    'players.getCurrent': function() {      
            return Session.get("currentPlayer");
    }
});

export const Players = new Mongo.Collection('players');

console.log方法中的'players.current'会返回正确的玩家ID,但一旦页面重定向到/:lobby,players.getCurrent将返回undefined。我希望players.getCurrent返回console.log返回的相同值。我该如何解决这个问题?这是在lobby.js中获取当前玩家ID的功能:

getCurrentPlayerId() {
    return Meteor.call('players.getCurrent');
}

2 个答案:

答案 0 :(得分:0)

根据Meteor API,Meteor方法是您定义从客户端调用的服务器端行为的方式。它们实际上是要在服务器上定义的。

  

方法是Meteor客户端可以使用Meteor.call调用的远程函数。

客户端上定义的Meteor方法只是作为存根。

  

在客户端上调用方法定义与同名服务器方法相关联的存根函数

根据您的代码,您似乎正在做客户端的所有事情。实际上,session是Meteor客户端API的一部分(不能在服务器上使用)。

  

Session在客户端上提供了一个全局对象,可用于存储任意一组键值对。

因此,如果我是你,我会在某种类型的util文件中实现所有这些逻辑,然后您可以将其导入到您需要的模板中。你实际上是在做同样的事情,你只需要使用常规函数而不是Meteor方法。

以下是一个示例util文件(请务必根据项目的文件结构更新播放器导入)。

import { Players } from './players.js';
import { Session } from 'meteor/session';

export const players = {
  insert: function(code, name) {
    console.log('adding player: ', name , code);
    return Players.insert({code: code, name: name});
  },

  updateAll: function(ids, characters, banners, countries, ancestors) {
    for (var i = 0; i < characters.length; i++) {
      Players.update({_id: ids[i]}, {$set: {character: characters[i], banner: banners[i], country: countries[i], ancestor: ancestors[i]},});
    }
  },

  setCurrent: function(playerId) {
    Session.set("currentPlayer", playerId);
    console.log(Session.get("currentPlayer"));
  },

  getCurrent: function(unixTimestamp) {
    return Session.get("currentPlayer");
  },
};

然后,您可以将其导入到您定义了问题中包含的事件处理程序的任何模板中。

import { Template } from 'meteor/templating';
import { players } from './utils.js';

Template.template_name.events({
  'click .class': handleSubmit (event, instance) {
    event.preventDefault();
    var party = Players.findOne({code: this.refs.code.value});

    if (typeof party !== 'undefined') {
        var playerId = players.insert(this.refs.code.value, this.refs.name.value);
        players.setCurrent(playerId);
        location.href = "/" + this.refs.code.value;
    } else {
        document.getElementById("error").innerHTML = 'Please enter a valid party code';
    }
  },
});

当然,您需要修改上面的代码,以使用正确的模板名称和utils文件的位置。

答案 1 :(得分:0)

我认为问题在于您正在使用

location.href = "/" + this.refs.code.value;

而不是使用

Router.go("/"+this.refs.code.value);

如果使用Iron Router。这样做就像刷新页面一样。在这里a package to maintain Session variables across page refreshes