模块中的NodeJS必需模块始终未定义

时间:2015-06-09 23:00:49

标签: javascript node.js undefined

我对后端代码非常陌生。现在我尝试学习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个模块:

  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;
    

    我的主要问题是,我可以使用来自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上走了一圈,在这里堆栈溢出,没有为我的问题找到任何解决方案。

    感谢和最好的问候,

    迈克尔

1 个答案:

答案 0 :(得分:1)

您的模块之间存在循环依赖关系。

首先要求玩家。它做的第一件事是需要房间。然后房间需要玩家。此时,玩家还没有完成加载。节点通过返回不完整版本的Player来防止发生无限循环。在这一点上,所有赌注都将关闭将会发生什么。

您需要构建模块以避免这种直接循环。

循环依赖的背景信息:https://nodejs.org/api/modules.html#modules_cycles