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);
});
});
});
}
}
3 answers
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.
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();
...
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.`);