web-dev-qa-db-fra.com

Comment puis-je exporter socket.io vers d'autres modules de nodejs?

J'ai socket.io travaille dans app.js mais quand j'essaie de l'appeler depuis d'autres modules, il ne crée pas io.connection pas sûr?

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

consommateur.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);
                });
            });
        });
}
}
15
hussain

Puisque app.js est généralement le type de module d'initialisation principal de votre application, il initialisera à la fois le serveur Web et le socket.io, et chargera d'autres éléments nécessaires à l'application. 

En tant que tel, un moyen typique de partager io avec d'autres modules consiste à les transmettre aux autres modules de la fonction constructeur de ce module. Cela fonctionnerait comme ceci:

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

Ensuite, dans 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);
        });
    });
};

Ou, si vous souhaitez utiliser une méthode .start() pour initialiser des éléments, vous pouvez faire la même chose avec cela (différences mineures):

// 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

Et la méthode de démarrage dans 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);
            });
        });
    };
}

C'est ce que l'on appelle le module "Push" de partage de ressources. Le module qui vous charge vous envoie des informations partagées en les transmettant au constructeur.

Il existe également des modèles "d'extraction" dans lesquels le module lui-même appelle une méthode dans un autre module pour extraire les informations partagées (dans ce cas, l'objet io).

Il est souvent possible de faire fonctionner l'un ou l'autre modèle, mais l'un ou l'autre se sentira plus naturel compte tenu du mode de chargement des modules et du choix des personnes qui possèdent les informations souhaitées, ainsi que de la manière dont vous souhaitez les réutiliser dans d'autres circonstances.

25
jfriend00

Si vous voulez éviter la portée globale, faites en sorte que votre io existe dans un fichier séparé comme celui-ci:

var sio = require('socket.io');
var io = null;

exports.io = function () {
  return io;
};

exports.initialize = function(server) {
  return io = sio(server);
};

Puis dans 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(...);

et 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);
  });
});
19
Patrick Roberts

Vous pouvez créer une instance singleton en 4 lignes seulement.

Dans websocket.js, écrivez le code de configuration de votre serveur.

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

module.exports = socketIO(server);

Ensuite, dans le fichier consumer.js, il suffit d’exiger le fichier

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

/* API logic here */

socket.emit('userRegistered', `${user.name} has registered.`);
1
Dušan Minić