Javascript TypeError:utils.getPlayerName不是函数

Javascript TypeError:utils.getPlayerName不是函数,javascript,node.js,error-handling,Javascript,Node.js,Error Handling,我一定是把module.exports弄错了。不幸的是,我似乎无法理解。我正在Node.js中开发一个Yugioh游戏(是的,那个老孩子的交易卡游戏),作为一个控制台应用程序(至少现在是这样)。任何帮助都将不胜感激 game.js: var utils = require("./utils"); var legend = require("./legend"); var manager = require("./eventManager"); module.exports = { da

我一定是把module.exports弄错了。不幸的是,我似乎无法理解。我正在Node.js中开发一个Yugioh游戏(是的,那个老孩子的交易卡游戏),作为一个控制台应用程序(至少现在是这样)。任何帮助都将不胜感激

game.js:

var utils = require("./utils");
var legend = require("./legend");
var manager = require("./eventManager");

module.exports = {
    data: {
        players: {
            0: {
                name: null,
                lifePoints: 4000
            },

            1: {
                name: null,
                lifePoints: 4000
            }
        },

        phase: null,

        turnOwner: null,

        turnCount: 1,

        hasEnded: false
    },

    draw: function(playerId, amount) {
        utils.out("Draw " + amount + " -> " + utils.getPlayerName(playerId));
    },

    cyclePhase: function(phaseId) {
        if (phaseId) {
            // TODO
        }
        else {
            if (this.data.phase == null) {
                this.data.phase = legend.phases.standby;
                this.cyclePhase();
            }
            else {
                switch (this.data.phase) {
                    case legend.phases.standby: {
                        manager.triggerEvent(legend.phaseEvents.start_standby, this.data.turnOwner);
                        utils.out("Phase -> Stand-By Phase");

                        break;
                    }

                    case legend.phases.draw: {
                        manager.triggerEvent(legend.phaseEvents.end_standby, this.data.turnOwner);
                        manager.triggerEvent(legend.phaseEvents.in_draw, this.data.turnOwner);
                        utils.out("Phase -> Draw Phase");

                        break;
                    }

                    case legend.phases.main1: {
                        manager.triggerEvent(legend.phaseEvents.start_main1, this.data.turnOwner);
                        utils.out("Phase -> Main Phase 1");

                        break;
                    }

                    case legend.phases.battle: {
                        manager.triggerEvent(legend.phaseEvents.end_main1, this.data.turnOwner);
                        manager.triggerEvent(legend.phaseEvents.start_battle, this.data.turnOwner);
                        utils.out("Phase -> Battle Phase");

                        break;
                    }

                    case legend.phases.main2: {
                        manager.triggerEvent(legend.phaseEvents.end_battle, this.data.turnOwner);
                        manager.triggerEvent(legend.phaseEvents.start_main2, this.data.turnOwner);
                        utils.out("Phase -> Main Phase 2");

                        break;
                    }

                    case legend.phases.end: {
                        manager.triggerEvent(legend.phaseEvents.end_main2, this.data.turnOwner);
                        manager.triggerEvent(legend.phaseEvents.in_end, this.data.turnOwner);
                        utils.out("Phase -> End Phase")

                        break;
                    }
                }
            }
        }

        this.data.turnCount++;

        manager.triggerEvent(legend.turnEvents.countUpdate, null, this.data.turnCount);
    },

    activateCard: function(playerId, cardId, activationType, slotId) {

    },

    summonMonster: function(cardId, summonType) {
        // TODO
    },

    setCard: function(cardType, slotId, slotPos, handSlotPos) {
        switch (cardType) {
            case 0: {

            }
        }
    }
};
utils.js:

var game = require("./game");

module.exports = {
    out: function(msg) {
        console.log(" " + msg);
    },

    getPlayerName: function(playerId) {
        return game.data.players[playerId].name;
    },

    getRandomInt: function(min, max) {
        return min + Math.floor(Math.random() * (max - min + 1));
    }
};
堆栈跟踪:

TypeError: utils.getPlayerName is not a function
    at Object.module.exports.draw (/home/ubuntu/workspace/game.js:29:53)
    at start (/home/ubuntu/workspace/engine.js:16:10)
    at Object.<anonymous> (/home/ubuntu/workspace/engine.js:6:1)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)
    at startup (node.js:139:18)
    at node.js:974:3
TypeError:utils.getPlayerName不是函数
在Object.module.exports.draw(/home/ubuntu/workspace/game.js:29:53)
开始时(/home/ubuntu/workspace/engine.js:16:10)
反对。(/home/ubuntu/workspace/engine.js:6:1)
在模块处编译(Module.js:409:26)
在Object.Module.\u extensions..js(Module.js:416:10)
在Module.load(Module.js:343:32)
在Function.Module.\u加载(Module.js:300:12)
位于Function.Module.runMain(Module.js:441:10)
启动时(node.js:139:18)
在node.js:974:3

我自己想出来的。我不明白,但我设法改正了错误。我从文件“utils.js”中删除了变量“game”,并将函数“getPlayerName”移到了文件“game.js”中,不知何故解决了这个问题