Javascript Socket.io无法到达模块

Javascript Socket.io无法到达模块,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我正在尝试为我的聊天/视频聊天应用程序创建一个用户模块。为此,我有以下服务器文件: /** * Created by root on 3/13/15. */ var multer = require('multer'); var express = require('express'); bodyParser = require('body-parser'); var app = express(); var http = require('http').Server(app); v

我正在尝试为我的聊天/视频聊天应用程序创建一个用户模块。为此,我有以下服务器文件:

    /**
 * Created by root on 3/13/15.
 */
var multer = require('multer');
var express = require('express');
bodyParser = require('body-parser');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var cookieParser = require('socket.io-cookie-parser');
var ExpressPeerServer = require('peer').ExpressPeerServer;

var userModule = require('./costum_modules/UserModule.js');
io.on('connection', function (socket) {
    var my_user = userList.id;
    socket.on('userData', function (userDetails) {
        userModule.appendUser(userDetails);
    });


    var chatModule = require('./costum_modules/ChatModule.js')(socket, userModule);
    var cacheModule = require('./costum_modules/CacheModule.js')(socket, userModule);
    var notificationModule = require('./costum_modules/NotificationModule')(socket, sequelize, userList);

});


app.use('/peerjs', ExpressPeerServer(http, options));

var listenTo = require('./port.json')["port"];

http.listen(listenTo, function () {
    console.log('listening on *:' + listenTo);
});
如您所见,我的
userModule
变量位于
io.on('connection')

只是因为我想将所有用户及其详细信息存储在该模块中,而不是每个连接

然而遗憾的是,现在我无法在
连接
功能中使用模块及其功能

有人能告诉我如何解决这个问题吗

im获取:
TypeError:userModule.appendUser不是函数

用户模块

    var UserModule = function (socket) {
    var activeUsers = [];

    this.appendUser = function (userDetails) {
        activeUsers.push(userDetails);
    };

    this.getUserById = function (id) {
        activeUsers.forEach(function (y) {
            if (y.id == id) {
                return y;
            }
        });
    }

};

module.exports = function (socket) {
    return new UserModule(socket);
};
更新了我的代码:

    var UserModule = function () {
    var activeUsers = [];

    this.appendUser = function (userDetails) {
        activeUsers.push(userDetails);
    };

    this.getUserById = function (id) {
        activeUsers.forEach(function (y) {
            if (y.id == id) {
                return y;
            }
        });
    }

};

module.exports = function () {
    return new UserModule();
};
server.js

    var userModule = require('./costum_modules/UserModule.js');
io.on('connection', function (socket) {
    var my_user = userList.id;
    socket.on('userData', function (userDetails) {
        userModule.appendUser(userDetails);
    });


    var chatModule = require('./costum_modules/ChatModule.js')(socket, userModule);
    var cacheModule = require('./costum_modules/CacheModule.js')(socket, userModule);
    var notificationModule = require('./costum_modules/NotificationModule')(socket, sequelize, userModule);

});

如果我将模块的需求放在io.on('connect')中,我可以很好地访问这些函数。但是,这不是我想要的,因为它将为与我的服务器建立的每个连接初始化它。

出现此错误的原因是因为这行:

var userModule = require('./costum_modules/UserModule.js');
不返回
UserModule
,而是返回接受套接字的函数:

function (socket) {
    return new UserModule(socket);
};
为了获得具有适当的
appendUser
函数的有效UserModule对象,您需要执行以下操作:

// provide the module with a socket
var userModule = require('./costum_modules/UserModule.js')(socket);

但我怀疑您希望在创建套接字之前创建一个。如果只想创建要使用的单个用户模块,请将
UserModule.js
导出类型更改为:

module.exports = new UserModule();

并从UserModule构造函数中移除套接字。

您可以发布相关的
UserModule.js
code吗?@MattWay抱歉,现在已经发布了。如果您
需要('./costum_modules/UserModule.js')(),该怎么办?Erm如果我在io.on(connect)函数中移动require,我就能够调用模块中的函数(如appendUser),那么这怎么可能是正确的呢?我不得不猜测,如果你在connect函数中移动require,你就是在将套接字传递给require调用。为什么不将与require行一起工作的代码粘贴到connect函数中。我已经添加了我现在拥有的代码,但仍然会遇到相同的错误。记住,这一行
var userModule=require('./costum_modules/userModule.js')返回一个函数。您需要运行函数来获取实际对象,因此它应该是
var userModule=require('./costum_modules/userModule.js')()。注意结尾的括号。或者按照我的回答,将导出行更改为
module.exports=newusermodule()