Después de indagar en varios repositorios y sitios de internet finalmente dimos con la respuesta que te compartimos aquí.
Solución:
Dado que app.js suele ser una especie de módulo de inicialización principal en su aplicación, normalmente inicializará el servidor web y socket.io y cargará otras cosas que necesita la aplicación.
Como una forma típica de compartir io
con otros módulos es pasándolos a los otros módulos en la función constructora de ese módulo. Eso funcionaría así:
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
Luego, en consumidor.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);
);
);
;
O, si desea utilizar un .start()
método para inicializar las cosas, puede hacer lo mismo con eso (diferencias menores):
// 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
Y el método de inicio en consumer.js
// 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);
);
);
;
Esto es lo que se conoce como el módulo “push” de intercambio de recursos. El módulo que te está cargando te envía información compartida pasándola al constructor.
También hay modelos “pull” en los que el propio módulo llama a un método en algún otro módulo para recuperar la información compartida (en este caso, el io
objeto).
A menudo, se puede hacer que cualquiera de los modelos funcione, pero generalmente uno u otro se sentirá más natural dada la forma en que se cargan los módulos y quién tiene la información deseada y cómo pretende que los módulos se reutilicen en otras circunstancias.
Si quiere evitar el alcance global, haga su io
existen en un archivo separado como este:
var sio = require('socket.io');
var io = null;
exports.io = function ()
return io;
;
exports.initialize = function(server)
return io = sio(server);
;
luego en app.js
:
var server = require('http').createServer(app);
var io = require('./io').initialize(server);
require('./app/consumers/ditconsumer'); // loading module will cause desired side-effect
server.listen(...);
y en consumer.js
:
require('../io').io().on('connection', function(socket)
logger.log('info', message.value);
socket.on('message', function(message)
socket.emit('ditConsumer',message.value);
console.log('from console',message.value);
);
);
Puede crear una instancia de singleton en solo 4 líneas.
En websocket.js escriba el código de configuración de su servidor.
const socketIO = require('socket.io');
const server = require('http').createServer();
server.listen(8000);
module.exports = socketIO(server);
Luego, en su consumidor.js solo requiere el archivo
const socket = require('./websocket');
/* API logic here */
socket.emit('userRegistered', `$user.name has registered.`);