Como posso exportar socket.io para outros módulos em nodejs?

tenho socket.io a trabalhar em app.js mas quando estou a tentar chamá-lo a partir de outros módulos não está a criar io.connection Não tenho a certeza ?

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!');
});

consumidor.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);
                });
            });
        });
}
}
Author: hussain, 2016-07-21

3 answers

Desde a aplicação.js é normalmente o tipo de Módulo de inicialização principal em seu aplicativo, ele normalmente tanto inicializar o servidor web e socket.io e irá carregar outras coisas que são necessárias pela aplicação.

Como tal, uma forma típica de partilhar io com outros módulos é passando-os para os outros módulos na função de construtor desse módulo. Isso funcionaria assim:

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

Então, no 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);
        });
    });
};

Ou, se quiser utilizar um método .start() para inicializar as coisas, você pode fazer a mesma coisa com isso (diferenças 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

E o método de início no consumidor.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);
            });
        });
    };
}

Isto é o que é conhecido como o módulo "push" de partilha de recursos. O módulo que está a carregar você empurra alguma informação partilhada para si, passando-a no construtor.

Existem também modelos "pull" onde o próprio módulo chama um método em algum outro módulo para obter a informação partilhada (neste caso o objecto io).

Muitas vezes, ambos os modelos podem ser feitos para funcionar, mas normalmente um ou outro se sentirá mais natural dado como os módulos estão sendo carregados e quem tem a informação desejada e como você pretende que os módulos sejam reutilizados em outras circunstâncias.

 20
Author: jfriend00, 2016-07-21 22:12:50

Se quiser evitar o âmbito global, Faça com que o seu io exista num ficheiro separado como este:

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
    });
  });
};

Depois na aplicação.js:

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

server.listen(...);

E no consumidor.js:

...
var socket = require('../io').io();
...
 13
Author: Patrick Roberts, 2016-07-21 19:20:22
Pode fazer uma instância singleton em apenas 4 linhas.

Em websocket.js escreve o seu código de configuração do servidor.

const socketIO = require('socket.io');
const server = require('http').createServer();
server.listen(8000);

module.exports = socketIO(server);

Então no seu consumidor.js só precisa do Arquivo

const socket = require('./websocket');

/* API logic here */

socket.emit('userRegistered', `${user.name} has registered.`);
 0
Author: Dušan Minić, 2018-03-04 12:05:02