Saltar al contenido

¿Cómo puedo exportar socket.io a otros módulos en nodejs?

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.`);

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *