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 构造函数中删除套接字。
我正在尝试为我的聊天/视频聊天应用程序创建一个用户模块。为此,我有以下服务器文件:
/**
* 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 构造函数中删除套接字。