2013-12-09 6 views
7

は私が失敗するが、異なるのNode.jsモジュールにsocket.ioのソケットオブジェクトを共有して、空のオブジェクトを取得しようとしています与え共有socket.ioは空のオブジェクト

Cannot call method 'on' of undefined 

マイコード:

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; 

ルート/ rss.js

私はこのことから得る出力です
io = require(__dirname + '/../app'); 

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

$ 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) 

私が試していると私は一つだけ(app.js)にsocket.ioと同じことを行うことができますが

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

答えて

15

を提出app.jsには、あなたが持っている:

exports.io = io; 

その後、あなたはそうのようにそれを使用する必要があります:あなたは、そのモジュールを必要とするときに、あなたがioを持つオブジェクトを取得し、あなたがモジュールにioというプロパティを取り付けた、と言っている

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

プロパティセット。

また

module.exports = io; 

を行い、その後、あなたは今それを持っているようにrss.jsを残すことができます。


あなたはノードとapp.jsを実行している場合、言ったことすべてを、あなたは、はるかに一般的に他のモジュール(の代わりに、他の方法で回避)に注入ioオブジェクトが表示されます。例えば:

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

私は時々 'TypeError例外を取得します:socketioオブジェクトを使用しようとしているときにundefined'の「EMIT」メソッドを呼び出すことはできませんグローバルなものとして: 'var socketio; module.exports = function(io){io.socketです。on( 'connection'、function(socket){socketio = socket;}); 'それをコードのどこかで使用します。 – Patryk

+0

これは、最後にアプリケーションに接続した人を示す 'socketio'というトップレベルの変数を設定します。誰も接続していなければ 'undefined 'となります。 –

3

私はconnectionハンドラへioオブジェクトを渡します。

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

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

./routes/socket.jsには、次のものが含まれている必要があります。このメソッドを使用して

var socket = module.exports = {}; 

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

もう少し説明できますか? 'exporting file'、 'socket.js'には何が必要ですか? – Patryk

+0

更新の回答 – chovy