使用 Socket.io 将套接字传递到 Node 中的模块.js

Pass Socket to Module in Node.js using Socket.io

本文关键字:Node 模块 js io Socket 套接字 使用      更新时间:2023-09-26

我有一个模块

var exports = module.exports = {};
exports.refresh = function (msg) {
    socket.emit('refresh', { message: msg });
}
exports.lock = function (msg) {
    socket.emit('lock', { message: msg });
}

在我的服务器中.js我定义了

var io = require("socket.io").listen(server);

并调用模块

var period = require('./server/functions/period.js');

如何将套接字传递给模块(句点.js),以便我可以访问套接字方法,例如socket.emitbroadcastio.sockets.emit

有几种方法可以解决这个问题。这取决于您希望如何使用实际模块。每个套接字只有一个实例,或每个套接字一个实例。我建议你让你的模块返回一个构造函数而不是一个对象文字,如下所示:

module.exports = function(socket) {
    var socket = socket;
    this.refresh = function (msg) {
        socket.emit('refresh', { message: msg });
    }
    this.lock = function (msg) {
        socket.emit('lock', { message: msg });
    }
}

然后,您可以创建包含实际套接字的新对象。

var Period = require('./server/functions/period.js'),
    period = new Period(socket);

一种解决方案可能是对每个连接插座执行此操作。

var periodModule = require('./server/functions/period.js'),
io.on('connection', function(socket){
    var period = new periodModule(socket);
    //make a call
    period.refresh();
});

您还可以将 io 对象传递给模块以获取广播接口。

 module.exports = function(socket, io) {
    var socket = socket,
        io = io;
    this.broadcastSomething = function(..) {
        io.emit('data', { data: 'data'});
    }
    this.refresh = function (msg) {
        socket.emit('refresh', { message: msg });
    }
    this.lock = function (msg) {
        socket.emit('lock', { message: msg });
    }
}