NodeJS有些模块无法正常工作

时间:2016-01-17 19:33:18

标签: javascript node.js

我正在使用socket.io和nodejs制作游戏,并且我制作了一个名为rooms.js的模块,此模块需要users.js模块和fiveSocket.js模块 但是当我从主服务器文件中调用Rooms.New时,它表示fiveSocket未定义,Rooms.New调用users.js函数时出现同样的问题,我得TypeError: Cannot read property 'getSocketIDbyId' of undefined

rooms.js:

var mysql   = require('../mysql/mysql.js');
var headers = require('./headers.js');
var users   = require('./users.js');
var fiveSocket = require('./sockets.js');
var Rooms = {
    Obj: {},
    Room: function(data) {
        var room = this;
        this.name = data.name;
        this.users = [];
        this.floorCode = data.floor;
        this.description = data.desc;
        this.maxUsers = data.maxUsers;
        this.owner = data.owner;
        this.setTime = new Date().getTime();
        this.dbID = data.dbID;
        this.doorx = data.doorx;
        this.doory = data.doory;
        this.doordir = data.doordir;
    },
    New: function(socketID, roomID) {
        var keys      = Object.keys(Rooms.Obj).length;
        var id        = keys + 1;
        var callback  = function(row) {
            fiveSocket.emitClient(socketID, headers.roomData, {
                title: row.title,
                desc: row.description,
                mapStr: row.floorCode,
                doorx: row.doorx,
                doory: row.doory,
                doordir: row.doordir
            });
            var uid = users.getIdBySocketID(socketID);
            users.Obj[uid].curRoom = roomID;
            var rid = Rooms.getIdByDbID(roomID);
            Rooms.Obj[rid].users.push(uid);
        }
        if(Rooms.getIdByDbID(roomID) != false) {
            var room = Rooms.getIdByDbID(roomID);
            var row = { title: room.name, description: room.description, floorCode: room.foorCode, doorx: room.doorx, doory: room.doory, doordir: room.doordir };
            callback(row);
        } else {
            mysql.Query('SELECT * FROM rooms WHERE id = ? LIMIT 1', roomID, function(rows) {
                if(rows.length > 0) {
                    var row = rows[0];
                    Rooms.Obj[id] = new Rooms.Room({name: row.title, floorCode: row.floorCode, desc: row.description, maxUsers: row.maxUsers, owner: row.owner, dbID: row.id, doorx: row.doorx, doory: row.doory, doordir: row.doordir});
                    callback(row);
                }
            });
        }
    },
    removeUser: function(DBroomID, userID) {
        var rid = Rooms.getIdByDbID(DBroomID);
        var room = Rooms.Obj[rid];
        var index = room.indexOf(userID);
        if (index > -1) array.splice(index, 1);
    },
    Listener: function(users) {
        setInterval(function(){
            for(var roomID in Rooms.Obj) {
                var room = Rooms.Obj[roomID];
                // send users coordinates 
                room.users.forEach(function(uid) {
                    var socketID = users.getSocketIDbyId(uid);
                    var data = Rooms.getUsersInRoomData(roomID);
                    fiveSocket.emitClient(socketID, headers.roomUsers, data);
                });
                // unload inactive rooms (no users after 10 seconds)
                var activeUsers = room.users.length;
                var timestamp = room.setTime;
                var t = new Date(); t.setSeconds(t.getSeconds() + 10);
                var time2 = t.getTime();
                if(activeUsers <= 0 && timestamp < time2) {
                    Rooms.Remove(roomID);
                }
            }
        }, 1);
    },
    getUsersInRoomData: function(roomID) {
        var room = Rooms.Obj[roomID];
        var obj = {};
        room.users.forEach(function(uid) {
            var user = users.Obj[uid];  
            obj[uid] = {
                username: user.username,
                position: user.position,
                figure: user.figure
            };
        });
        return obj;
    },
    Remove: function(id) {
        delete Rooms.Obj[id];
    },
    getIdByDbID: function(dbID) {
        var result = null;
        for(var room in Rooms.Obj) {
            var u = Rooms.Obj[room]; 
            if(u.dbID == dbID) var result = room;
        }
        if(result == null) return false;
        else return result;
    },
    getDbIDbyId: function(id) {
        return Rooms.Obj[id].dbID;
    }
}
Rooms.Listener();
module.exports = Rooms;

编辑:(如果有帮助)

当我在主文件上安装console.log fiveSocket enter image description here

当我在rooms.js文件上安装console.log fiveSocket时 enter image description here

  

EDIT2:当我从var users = require('./users.js');移除了fiveSocket时,当我console.log rooms.js它有效时,为什么?   
编辑3:我还有问题

如果您需要其他模块来源:
Users.JS: http://pastebin.com/Ynq9Qvi7
sockets.JS http://pastebin.com/wpmbKeAA

1 个答案:

答案 0 :(得分:0)

“房间”需要“用户”,反之亦然,因此您正在尝试执行“循环依赖”。

快速搜索node.js需要循环依赖,这提供了很多东西,例如:

  

“模块中的循环依赖可能很棘手,难以调试   node.js中如果模块A在完成设置之前需要('B')   它是导出,然后模块B需要('A'),它会返回一个   而不是A可能想要导出的空对象。它使   逻辑意义上说,如果未设置A的导出,则需要在B中   导致空导出对象。尽管如此,它可能是一种痛苦   调试,对于那些曾经拥有这些内容的开发人员来说并不是天生明显的   循环依赖自动处理。幸运的是,有   解决问题的相当简单的方法。“

How to deal with cyclic dependencies in Node.js