从项目的任何位置获取socket.io命名空间

在我的REST调用和一些数据库插入之后,我想通过socket.io向前端发出一个新的通知,如下所示:

socket.broadcast.emit('send notification', notification); 

由于我这样做的function是通过REST而不是通过socket.io触发的,我没有variables“套接字”。

我起初以为我可以得到'io'

 var io = require('socket.io') // or like: require('socket.io')(3000) 

从这里我想我可以得到像这样的名字空间:

 var nsp = io.of('/notification-list'); nsp.on('connection', function (socket) { ... } 

但io似乎是未定义的(或者如果我使用它与端口3000我得到EADDRINUSE,因为显然socket.io连接到127.0.0.1:3000

这可能是一个非常愚蠢的问题,但由于我不能自己弄清楚:我怎样才能让socket准备在这个函数中使用? 任何帮助将非常感激!


编辑:

我试过friend00的解决scheme,但我仍然无法弄清楚如何做到这一点。

在我的server.js我创build服务器和导入我的socketIO这样的东西:

 var server = http.createServer(app).listen(app.get('port'), function () { }); require('./socketio_listener/socketIoListener')(server); 

那么我的socketIoListener.js

 var sockio = require("socket.io"); var io; function initIO(server) { if (!server) { throw new Error("ERR"); } if (!io) { io = sockio.listen(server); } return io; } module.exports.getIO = function () { if (!io) { throw new Error("ERR"); } return io; }; module.exports = function (server) { io = initIO(server); var nspNotification = io.of('/notification-list'); nspNotification.on('connection', function (socket) { socket.on('get notificationList', function (data) { notification.findNotifications(socket, data); }); // ... }); 

现在我尝试了函数,我想通过socket.io发射一些东西:

 var io = require("socket.io").getIO(); 

我也试过:

 var ioServer = require('../socketio_listener/socketIoListener'); ioServer.getIO(); 

但我仍然总是得到:

 TypeError: undefined is not a function 

我find了解决scheme,虽然我不太清楚为什么这是以前的问题:我将module.exports.getIO = function ()移动module.exports.getIO = function ()部,现在它工作得很好。 虽然我认为在socketIoListener.js的位置并不重要,但它显然没有。

您将不得不通过导出或模块方法调用的组合来将单个服务器端iovariables共享到其他模块。

一旦你有这样的初始化socket.io监听器:

 var io = require('socket.io').listen(server); 

您将需要与想要使用socket.io其他模块共享特定的io实例。 如何分享它取决于你的代码的结构和你试图分享的地方。


例如,你可以有一个只pipe理io初始化的模块:

 var sockio = require("socket.io"); var io; // mysocketio.js // constructor function - should only be called once and passed the http server module.exports = function(server) { if (!server) { throw new Error("Must pass http server instance to mysocketio module constructor"); } if (!io) { io = sockio.listen(server); } return io; }; module.exports.getIO = function() { if (!io) { throw new Error("Must call constructor of mysocketio module before getIO()"); } return io; }; 

然后,在一个地方你用特定的http服务器初始化它,你可以这样做:

 var io = require("mysocketio")(server); 

在你只想使用“已经初始化”的io的其他模块中,你可以这样做:

 var io = require("mysocketio").getIO();