2015-06-09 2 views
0

Я очень много нового для бэкэнд-кода. На данный момент я пытаюсь изучить архитектуру nodeJS-сервера.Требуемый модуль NodeJS в модуле всегда не определен

Моя проблема сейчас довольно просто я верю, но я не могу запустить через -.-

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 модуля:

  1. игрока
  2. номер
  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; 

Моя главная проблема в том, что я может использовать Room, Player, Game from server.js - конструктор, прототип и других функций.

В Player.js я тоже могу использовать импортированный Комнатный модуль!

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 

Я схожу с ума. Что я делаю не так? Когда я делаю console.log (debug) этой переменной «Player» в верхней части файла, я всегда становлюсь неопределенным.

Я гулял по Google и здесь, в stackoverflow, не найдя решения для моей проблемы.

Thx и наилучшие пожелания,

Майкла

+0

Это потому, что у вас есть [круговую 'требуют()'] (https://nodejs.org/api/modules.html#modules_cycles). –

ответ

0

У вас есть циклическая зависимость между вашими модулями.

Вы начинаете с запроса Игрока. Первое, что он делает, - это Комната. Затем комнате требуется Player. На этом этапе Player еще не завершил загрузку. Узел предотвращает бесконечный цикл, возникающий, возвращая неполную версию Player. На данный момент все ставки не учитывают того, что произойдет.

Вам необходимо структурировать свои модули, чтобы избежать этого прямого цикла.

Справочная информация циклических зависимостей здесь: https://nodejs.org/api/modules.html#modules_cycles

Смежные вопросы