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) 

हालांकि मैं कोशिश की है और मैं socket.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') 

// ... 

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; 

तो तुम इतनी की तरह उपयोग करने की आवश्यकता होगी: आप संलग्न आप कहते है कि

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

, एक संपत्ति मॉड्यूल के लिए io कहा जाता है, इसलिए जब आप कि मॉड्यूल की आवश्यकता होती है, आप एक वस्तु 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

मैं कभी कभी 'मिल जाएगा लेखन त्रुटि::

var socket = require('./routes/socket.js'); io.sockets.on('connection', function(sock){ socket.stuff(sock, io); }); 

./routes/socket.js निम्न होना चाहिए विधि कॉल नहीं कर सकता undefined' की 'फेंकना' socketio वस्तु का उपयोग करने का प्रयास करते समय वैश्विक एक के रूप में: 'var सॉकेटियो; module.exports = फ़ंक्शन (io) {io.socket।चालू ('कनेक्शन', फ़ंक्शन (सॉकेट) {सॉकेटियो = सॉकेट;}); और फिर कोड में कहीं भी इसका उपयोग करें; – Patryk

+0

यह 'सॉकेटियो' नामक एक शीर्ष-स्तरीय चर सेट करता है जो उस व्यक्ति को संदर्भित करता है जो हाल ही में ऐप से जुड़ा हुआ है। यदि कोई भी कनेक्ट नहीं हुआ है, तो यह 'अपरिभाषित' होगा। –

3

मैं connection हैंडलर में io वस्तु गुजरती हैं। इस विधि का उपयोग

var socket = module.exports = {}; 

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

क्या आप थोड़ा और समझा सकते हैं? 'निर्यात फ़ाइल', 'socket.js' में क्या होना चाहिए? – Patryk

+0

उत्तर अपडेट कर रहा है – chovy

संबंधित मुद्दे