Socket.io无法访问模块

时间:2015-12-02 14:24:13

标签: 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);
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

userModule

    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')里面,我能够很好地访问这些功能。然而,这不是我想要的,因为它将为我的服务器的每个连接初始化它。

1 个答案:

答案 0 :(得分:2)

您收到该错误的原因是这一行:

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