将socket.io共享给其他模块给出空对象

我试图在不同的node.js模块共享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) 

尽pipe我已经尝试过,并且只能在一个(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'}); }); 

因为在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 }); } 

我将io对象传入connection处理程序。

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