2015-06-09 88 views
0

我對後端代碼非常陌生。現在我試着學習nodeJS-server的體系結構。模塊中的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. 遊戲

每個模塊具有相同的結構:

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 - 構造函數,原型和a通常還有其他功能。

在Player.js中,我也可以正常使用導入的Room模塊!

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(調試)時,我總是處於未定義狀態。

我走過谷歌和在這裏在stackoverflow,沒有找到我的問題的任何解決方案。

THX和問候,

邁克爾

+0

這是因爲你有一個[圓形'需要()'](https://nodejs.org/api/modules.html#modules_cycles)。 –

回答

0

你有你的模塊之間的循環依賴。

你首先要求玩家。它所做的第一件事是需要房間。然後房間需要玩家。此時,Player尚未完成加載。節點通過返回Player的不完整版本來防止發生無限循環。在這一點上,所有的賭注都將會發生。

您需要構建模塊以避免此直接循環。這裏循環依賴的

背景資料:https://nodejs.org/api/modules.html#modules_cycles