Socket.io 无法访问模块

Socket.io cannot reach module

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

    /**
 * 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')

之外

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

然而遗憾的是,现在我无法在 connection 函数中使用该模块及其函数。

谁能告诉我如何解决这个问题?

我得到:TypeError: userModule.appendUser is not a function

用户模块

    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');

不是returnUserModule,而是return是一个接受套接字的函数:

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 构造函数中删除套接字。