当前位置: 首页 > 知识库问答 >
问题:

页面重定向后未定义流星会话

魏安宁
2023-03-14

我正在做一个游戏,需要一个大堂的玩家,但没有帐户。有点像游戏,间谍。我正在使用Meteor会话来了解哪个玩家加入了大厅,这样我就可以返回该特定玩家的正确数据。我有一个join.js组件,用户在其中输入大厅访问代码和用户名。此组件还将用户重定向到大厅。join.js位于路由/join,而lobbies位于路由/: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';
    }

我正在使用players.js集合中的meteor.methods中的会话来获取当前用户。

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,但一旦页面重定向到/:lobby,players.getcurrent返回未定义的播放机id。我希望players.getCurrent返回与console.log返回的值相同的值。如何解决此问题?这是获取lobby.js中当前播放器id的函数:

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

共有2个答案

微生俊
2023-03-14

我认为问题是你在使用

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

而不是使用

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

如果使用铁路由器。这样做就好像你在刷新页面。这里有一个包用来在页面刷新过程中维护会话变量。

董高洁
2023-03-14

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

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

在客户端上定义的Meteor方法只是充当存根。

调用与同名服务器方法关联的客户端定义 ;stub ;函数 ;methods ;

根据您的代码,看起来您是在客户端执行所有操作。事实上,session是Meteor客户机API的一部分(不能在服务器上使用)。

Session ;在客户端上提供一个全局对象,您可以使用该对象存储任意一组键值对。

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

下面是一个示例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文件的位置。

 类似资料:
  • 我使用jsf servlet并创建了自定义登录页面,使用了带有动作j_spring_security_check的表单,方法POST,使用了j_username和j_password。当我单击登录按钮时,我遇到的问题不是重定向到页面,而是在Chrome网络列中显示了带有302状态代码的post方法j_spring_security_check,我是否使用了Spring安全的正确方式? 登录。jsf

  • 安全性:编码器:AppBundle\Entity\Usuario:算法:bcrypt#https://symfony.com/doc/current/security.html#b-配置如何加载用户提供程序:db\U提供程序:实体:类:AppBundle:Usuario

  • 问题内容: 在一段时间后,有一些用于重定向的PHP函数。我在某处看到它,但记不起来了。就像登录后的gmail重定向一样。请有人提醒我吗? 问题答案: header( “refresh:5;url=wherever.php” ); 这是php的设置方式,它将在 5秒内* 将您重定向到 * 请记住,必须先通过常规HTML标记,文件中的空白行或从PHP发送任何实际输出,然后调用header()。读取包含

  • 我使用的是和和。一切都很好,但是当会话超时的时候,我会得到以下错误”,因为我已经在布局的main.gsp文件中调用了session变量。现在,我希望在每次会话超时后重定向到登录页面,并且不显示错误页面。要在会话超时后重定向,我已经在文件中这样做了 但是有这么多页,所以很难写每一页。还有其他的方法做这件事吗?请帮忙。

  • 问题内容: 我正在做一个简单的论坛,由一系列论坛组成,每个论坛分别代表首页,主题,postitit,登录名和用户列表页面。在某些页面上,当用户未登录时会出现一个链接。 我想要实现的是在登录后触发重定向(在RequestDispatcher上使用forward()),以便浏览器返回到用户在单击登录链接之前所在的页面。为此,我看到了两种解决方案。 第一种解决方案是使用带有登录按钮的HTML 和一个不可

  • 我有一个文件,带有一个,具有和字段,在上,它用