从项目的任何位置获取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
的位置并不重要,但它显然没有。
您将不得不通过导出或模块方法调用的组合来将单个服务器端io
variables共享到其他模块。
一旦你有这样的初始化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();