如何将socket.io导出到nodejs中的其他模块?

我有socket.io工作在app.js但是当我试图从其他模块调用它不创buildio.connection不知道?

app.js

 var express = require('express'); var app = express(); var server = require('http').createServer(app); var io = require('socket.io')(server); var ditconsumer = require('./app/consumers/ditconsumer'); ditconsumer.start(io); server.listen(3000, function () { console.log('Example app listening on port 3000!'); }); 

consumer.js

 module.exports = { start: function (io) { consumer.on('message', function (message) { logger.log('info', message.value); io.on('connection', function (socket) { socket.on('message', function(message) { socket.emit('ditConsumer',message.value); console.log('from console',message.value); }); }); }); } } 

由于app.js通常是应用程序中的主要初始化模块,它通常会初始化Web服务器和socket.io,并将加载应用程序所需的其他内容。

与其他模块共享io的典型方式是将它们传递给该模块的构造函数中的其他模块。 这将是这样的工作:

 var server = require('http').createServer(app); var io = require('socket.io')(server); // load consumer.js and pass it the socket.io object require('./consumer.js)(io); // other app.js code follows 

然后,在consumer.js中:

 // define constructor function that gets `io` send to it module.exports = function(io) { io.on('connection', function(socket) { socket.on('message', function(message) { logger.log('info',message.value); socket.emit('ditConsumer',message.value); console.log('from console',message.value); }); }); }; 

或者,如果您想使用.start()方法来初始化事物,则可以使用相同的方法进行初始化(次要区别):

 // app.js var server = require('http').createServer(app); var io = require('socket.io')(server); // load consumer.js and pass it the socket.io object var consumer = require('./consumer.js); consumer.start(io); // other app.js code follows 

consumer.js中的start方法

 // consumer.js // define start method that gets `io` send to it module.exports = { start: function(io) { io.on('connection', function(socket) { socket.on('message', function(message) { logger.log('info',message.value); socket.emit('ditConsumer',message.value); console.log('from console',message.value); }); }); }; } 

这就是所谓的资源共享的“推”模块。 正在加载的模块将一些共享信息通过构造函数传递给您。

也有“拉”模型,其中模块本身调用其他模块中的方法来检索共享信息(在这种情况下是io对象)。

通常,无论哪种模式都可以工作,但是通常情况下,其中一个或者另一个会感觉更加自然,因为模块如何被加载,谁拥有所需的信息,以及您打算如何在其他情况下重用模块。

如果你想避免全球范围,让你的io存在一个单独的文件,如下所示:

 var sio = require('socket.io'); var io = null; exports.io = function () { return io; }; exports.initialize = function(server) { io = sio(server); io.on('connection', function(socket) { // Producer.startProducer(); /*ditconsumer.start(function(value){ io.emit('ditConsumer',value); });*/ socket.on('createlogfile', function() { logsRecording.userLogs(function(filename) { socket.emit('filename', filename); }); }); socket.on('startrecording', function(filename) { console.log('response after creating file', filename); logsRecording.recordLogs(filename); //value that will be send it to file }); }); }; 

然后在app.js中:

 var server = require('http').createServer(app); var io = require('./io').initialize(server); server.listen(...); 

在consumer.js中:

 ... var socket = require('../io').io(); ...