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()代码>