gpt4 book ai didi

javascript - Socket.io 无法访问模块

转载 作者:行者123 更新时间:2023-12-02 15:21:06 25 4
gpt4 key购买 nike

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

    /**
* 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不是一个函数

用户模块

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

关于javascript - Socket.io 无法访问模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34045132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com