Javascript 使用Socket.io将Socket传递给Node.js中的模块

Javascript 使用Socket.io将Socket传递给Node.js中的模块,javascript,node.js,websocket,socket.io,Javascript,Node.js,Websocket,Socket.io,我有一个模块 var exports = module.exports = {}; exports.refresh = function (msg) { socket.emit('refresh', { message: msg }); } exports.lock = function (msg) { socket.emit('lock', { message: msg }); } 在我的server.js中,我定义了 var io = require("socket.i

我有一个模块

var exports = module.exports = {};

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

exports.lock = function (msg) {
    socket.emit('lock', { message: msg });
}
在我的server.js中,我定义了

var io = require("socket.io").listen(server);
并调用模块

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

如何将套接字传递给模块(period.js),以便访问套接字方法,例如
Socket.emit
broadcast
io.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 });
    }

}

非常感谢你!我在构造函数中更改了模块,但现在调用period.refresh()时出现错误,即没有“refresh”方法。有什么想法吗?试着在模块中返回这个,发现错误:D我有一个名为句点:D的Mongo模型。对不起,我发现了另一个问题,也许你能帮上忙。当我重新启动服务器并连接客户端时,服务器崩溃,错误为Object 51没有方法刷新。你知道我该怎么预防吗?原因可能是什么?当socket只在io.connection函数中可用时,怎么可能使用一个实例来表示所有实例呢?我想我已经用{'force new connection':true}解决了这个问题