我已经开发了几个月的应用程序,并且尝试了一种在需要的模块之间共享我的socket.io实例的方法。我用来共享它的方法一直不一致,在周末的三天里,我一直想将其重构为更优雅的方法。在过去几天中搜索SO并尝试使用其他共享实例的方法后,我没有想法了。
我创建了一个新的NodeJs文件“ debug.js”,并在其中导入了一个socket.io实例,该实例已成功与我的主要套接字端点和另一个文件共享。在此文件中,我做了两件事。 1.我发出一个发出消息,客户端从未收到过。 2.我尝试在永不触发的函数调用中记录“ io”的值。
debug.js
const io = require('./../main/index.js');
io.emit('test');
function test() {
console.log('io logged')
console.log(io);
}
test();
io.on('debug', function(socket){
console.log('test')
})
根据我所读到的有关在节点内进行加载和缓存的信息,我最好的猜测是该模块甚至没有运行。在其他情况下,例如
sockets.js
var sockets;
module.exports = {
start: function (io) {
sockets = io;
io.on('connection', function (socket) {
this.io = socket;
socket.on('validatePlaceAction', function (data) {
//do stuff and things
});
}.bind(this));
},
io: null
}
有时可以通过'io'属性共享io,有时与共享文件的加载方式无关。我的最终目标是采用一致的方式来发出socketio事件,以向我的客户端提供实时更新,在上面的示例中,“ validatePlaceAction”返回一个布尔值,确定客户端是否将加载事件,或者onclick事件将失败。
index.js
const http = require('http');
const app = require('./server/routes.js');
const server = app.listen(8080, function () { console.log('port 8080 is live!'); });
const socketio = require('socket.io');
const io = require('./server/sockets');
let sockets = socketio.listen(server);
const socket = io.start(sockets);
io.start将套接字实例馈入一个属性,该属性随后具有所有不太正确的套接字逻辑。主要是因为我无法转身与其他文件共享该逻辑。似乎我在其中缺少一些东西,但是反复试验并没有弄清楚是什么。