在我的REST调用和一些数据库插入之后,我想通过socket.io向前端发出新的通知,如下所示:
socket.broadcast.emit('send notification', notification);
由于我正在执行的功能是通过REST触发的,而不是通过socket.io触发的,因此我没有变量'socket'。
我以为起初我可以像这样获得“ 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的解决方案,但仍然不知道如何执行此操作。
在我中,server.js
我创建服务器并导入我的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
解决方案
我找到了解决方案,尽管我以前不太确定为什么会出现问题:我移至module.exports.getIO = function ()
最底层,现在可以正常使用了。尽管我认为放在表socketIoListener.js
中没关系,但看起来确实有关系。
您将必须io
通过导出或模块方法调用的某种组合将单个服务器端变量共享给其他模块。
一旦初始化了socket.io侦听器,如下所示:
var io = require('socket.io').listen(server);
您将需要io
与要使用的其他模块共享特定实例socket.io
。共享的确切程度取决于代码的结构以及共享位置。
例如,您可能有一个仅管理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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句