socketio nodejs在导入时返回未定义

时间:2018-08-24 21:53:17

标签: node.js sockets express socket.io

我已经开发了几个月的应用程序,并且尝试了一种在需要的模块之间共享我的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将套接字实例馈入一个属性,该属性随后具有所有不太正确的套接字逻辑。主要是因为我无法转身与其他文件共享该逻辑。似乎我在其中缺少一些东西,但是反复试验并没有弄清楚是什么。

0 个答案:

没有答案