我正在做一个游戏,需要一个大堂的玩家,但没有帐户。有点像游戏,间谍。我正在使用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');
}
根据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文件的位置。
我认为问题是你在使用
location.href = "/" + this.refs.code.value;
而不是使用
Router.go("/"+this.refs.code.value);
如果使用铁路由器。这样做就好像你在刷新页面。这里有一个包用来在页面刷新过程中维护会话变量。