2013-12-09 2 views
7

sto cercando di condividere socket.io s' presa oggetto in diversi moduli Node.JS anche se non riesco e ottenere l'oggetto vuoto concondivisione socket.io ad altri moduli dà oggetto vuoto

Cannot call method 'on' of undefined 

Il mio codice:

app.js

var express = require('express') 
    , app = express(); 

var server = require('http').createServer(app) 
    , io = require('socket.io').listen(server) 

var routes = require('./routes') 
    , path = require('path') 
    , rss = require('./routes/rss') 

// ... 

exports.io = io; 

circuiti/rss.js

io = require(__dirname + '/../app'); 

console.log(io); 
io.sockets.on('connection', function(
    console.log("Connection on socket.io on socket"); 
    // .. do stuff 
}); 

Questo è l'uscita che ricevo da questo: Anche se ho provato e posso fare lo stesso con socket.io solo in uno (app.js) il file

$ node app.js                          
    info - socket.io started 
{} 

/home/XXX/programming/nodejs/node-express-aws/routes/rss.js:10 
io.sockets.on('connection', function(socket){ 
     ^
TypeError: Cannot call method 'on' of undefined 
    at Object.<anonymous> (/home/XXX/programming/nodejs/node-express-aws/routes/rss.js:10:12) 
    at Module._compile (module.js:456:26) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Module.require (module.js:364:17) 
    at require (module.js:380:17) 
    at Object.<anonymous> (/home/XXX/programming/nodejs/node-express-aws/app.js:9:10) 
    at Module._compile (module.js:456:26) 
    at Object.Module._extensions..js (module.js:474:10) 

var express = require('express') 
    , app = express(); 

var server = require('http').createServer(app) 
    , io = require('socket.io').listen(server) 

var routes = require('./routes') 
    , path = require('path') 
    , rss = require('./routes/rss') 

// ... 

io.sockets.on('connection', function(socket){ 
    logger.debug("Connection on socket.io on socket"); 
    socket.emit('news', {will: 'be recived'}); 
}); 

risposta

15

Poiché, in app.js, hai:

exports.io = io; 

allora si avrebbe bisogno di usarlo in questo modo:

var app = require('../app'); 
var io = app.io; 

vale a dire che dici, è attaccato una proprietà chiamata io al modulo, in modo che quando si richiede che il modulo, si ottiene un oggetto che ha la io insieme di proprietà.

Si potrebbe anche fare

module.exports = io; 

e poi lasciare rss.js come lo avete ora.


Detto questo, se si sta eseguendo app.js con nodo, si molto più comunemente vedere l'oggetto io iniettato in altri moduli (anziché il contrario); ad esempio:

app.js

var express = require('express') 
    , app = express(); 

var server = require('http').createServer(app) 
    , io = require('socket.io').listen(server) 

var routes = require('./routes') 
    , path = require('path') 
    , rss = require('./routes/rss') 

// ... 

rss(io); // pass `io` into the `routes` module, 
     // which we define later to be a function 
     // that accepts a Socket.IO object 

routes/rss.js

module.exports = function(io) { 
    io.sockets.on('connection', function(
    console.log("Connection on socket.io on socket"); 
    // .. do stuff 
    }); 
} 
+0

Utilizzando questo metodo io a volte ottenere 'TypeError: Impossibile chiamare il metodo 'emettere' di undefined' durante il tentativo di utilizzare socketio oggetto come globale: 'var socketio; module.exports = function (io) {io.socket.on ('connection', function (socket) {socketio = socket;}); 'e quindi usarlo da qualche parte nel codice; – Patryk

+0

Imposta una variabile di primo livello denominata 'socketio' che si riferisce alla persona che ha effettuato l'ultima connessione all'app. Se nessuno è connesso, sarà 'indefinito'. –

3

passo l'oggetto io nel gestore connection.

var socket = require('./routes/socket.js'); 

io.sockets.on('connection', function(sock){ 
    socket.stuff(sock, io); 
}); 

./routes/socket.js devono contenere le seguenti:

var socket = module.exports = {}; 

socket.stuff = function(sock, io){ 
    //handle all events here 
}; 
+0

Puoi spiegare un po 'di più? cosa dovrebbe essere nel "file esportatore", "socket.js"? – Patryk

+0

aggiornamento risposta – chovy