簡體   English   中英

頁面重定向后流星會話未定義

[英]Meteor session is undefined after page redirect

我正在制作一個需要玩家游說但沒有帳戶的游戲。 有點像游戲Spyfall 我正在使用Meteor Sessions來了解哪個玩家加入了大廳,以便我可以返回該特定玩家的正確數據。 我有一個join.js組件,用戶可以在其中輸入大廳訪問代碼和用戶名。 該組件還將用戶重定向到大廳。 Join.js位於/ join路由,而大堂位於/:lobby路由。 這是join.js handleSubmit方法,該方法接受用戶輸入並將其放入players集合中:

    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';
    }

我正在使用player.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');

'players.current'方法中的console.log返回正確的玩家ID,但是一旦頁面重定向到players.getCurrent將返回undefined。 我希望players.getCurrent返回與console.log返回相同的值。 如何解決此問題? 這是在lobby.js中獲取當前玩家ID的功能:

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

根據Meteor API ,Meteor方法是定義從客戶端調用的服務器端行為的方式。 它們實際上是要在服務器上定義的。

方法是Meteor客戶端可以通過Meteor.call調用的遠程函數。

在客戶端上定義的Meteor方法只是充當存根。

客戶端上的調用方法定義與同名服務器方法相關聯的存根函數

根據您的代碼,您似乎在做客戶端的所有工作。 實際上,會話是Meteor客戶端API的一部分(不能在服務器上使用)。

會話在客戶端上提供了一個全局對象,可用於存儲任意一組鍵值對。

因此,如果我是您,那么我只會在某種util文件中實現所有這些邏輯,然后可以將其導入到需要的模板中。 您實際上是在做同樣的事情,只需要使用常規函數而不是Meteor方法即可。

這是一個示例util文件(請確保根據項目的文件結構更新Players導入)。

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文件的位置。

我認為問題是您正在使用

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

而不是使用

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

如果使用Iron Router。 就像刷新頁面一樣。 這是一個用於在整個頁面刷新期間維護Session變量的程序包

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM