我对后端代码非常陌生。现在我尝试学习nodeJS-server的架构。
我现在的问题很简单,我相信,但我无法通过-.-
server.js(主要):
var io = require("socket.io"),
express = require("express"),
expressHbs = require('express3-handlebars'),
Player = require("./models/Player").Player,
Room = require("./models/Room").Room,
Game = require("./models/Game").Game,
dataSet = require('./data/data.json');
//...
然后我有3个模块:
每个模块都是相同的结构:
Player.js
// importing another module
var Room = require("./Room").Room;
if (!Player.players) {
Player.players = {};
}
function Player(foo) {
this.foo = foo;
Player.players[foo] = this;
}
Player.getAllPlayersAsObject = function () {
return Player.players;
};
// ...
Player.prototype.removePlayer = function () {
if (Player.players.hasOwnProperty(this.id)) {
delete Player.players[this.id];
}
};
// ...
/**
* node export
* @type {Player}
*/
exports.Player = Player;
Room.js
var Player = require("./Player").Player;
if (!Room.rooms) {
Room.rooms = {};
}
function Room(foo) {
this.foo = foo
}
Room.getAllRoomsAsObject = function () {
return Room.rooms;
};
Room.prototype.toString = function () {
return JSON.stringify(this);
};
/**
* node export
* @type {Room}
*/
exports.Room = Room;
我的主要问题是,我可以使用来自server.js的Room,Player,Game - 构造函数,原型和所有其他函数。
在Player.js中,我也可以正常使用导入的Room-module!
Room.js告诉我:
path/path/path/gameserver/models/Room.js:222
var currentPlayer = Player.getPlayer(this.players[player].id);
^
TypeError: Cannot read property 'getPlayer' of undefined
我疯了。我究竟做错了什么?当我在文件顶部执行变量“Player”的console.log(调试)时,我总是得到未定义。
我在google上走了一圈,在这里堆栈溢出,没有为我的问题找到任何解决方案。
感谢和最好的问候,
迈克尔
答案 0 :(得分:1)
您的模块之间存在循环依赖关系。
首先要求玩家。它做的第一件事是需要房间。然后房间需要玩家。此时,玩家还没有完成加载。节点通过返回不完整版本的Player来防止发生无限循环。在这一点上,所有赌注都将关闭将会发生什么。
您需要构建模块以避免这种直接循环。
循环依赖的背景信息:https://nodejs.org/api/modules.html#modules_cycles