如何将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(); ...