Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从项目中的任何位置获取socket.io命名空间_Javascript_Node.js_Socket.io - Fatal编程技术网

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

Javascript 从项目中的任何位置获取socket.io命名空间,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,在我的REST调用和一些数据库插入之后,我希望通过socket.io向前端发送一个新通知,如下所示: socket.broadcast.emit('send notification', notification); var server = http.createServer(app).listen(app.get('port'), function () { }); require('./socketio_listener/socketIoListener')(server); var

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

socket.broadcast.emit('send notification', notification);
var server =
http.createServer(app).listen(app.get('port'), function () {
});
require('./socketio_listener/socketIoListener')(server);
var io = require('socket.io').listen(server);
由于我在中执行此操作的函数是通过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

这可能是一个非常愚蠢的问题,但由于我自己无法解决:我如何才能使
套接字
准备好用于此函数?任何帮助都将不胜感激


编辑:

我尝试了friend00的解决方案,但我仍然不知道如何做到这一点

在我的
server.js
中,我创建服务器并导入我的socketIO内容,如下所示:

socket.broadcast.emit('send notification', notification);
var server =
http.createServer(app).listen(app.get('port'), function () {
});
require('./socketio_listener/socketIoListener')(server);
var io = require('socket.io').listen(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侦听器后,如下所示:

socket.broadcast.emit('send notification', notification);
var server =
http.createServer(app).listen(app.get('port'), function () {
});
require('./socketio_listener/socketIoListener')(server);
var io = require('socket.io').listen(server);
您需要与希望使用
socket.io
的其他模块共享特定的
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);
var io = require("mysocketio").getIO();
在您只想使用“已初始化”io的其他模块中,您可以执行以下操作:

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

我尝试了你的解决方案,并将其添加到主题中,但不幸的是,它对我无效。你能告诉我我做错了什么吗?谢谢你的帮助!@Markus-你需要在下面找到你自己模块的路径:
var io=require(“你模块的路径”).getIO();
。我的答案有一个输入错误,我现在已经纠正了。仅供参考,对于节点模块来说,相对路径很难找到正确的路径。因此,您需要确保所有模块都被正确地找到。此外,我想知道为什么您会取出有用的错误消息,并将其替换为“错误”。这不会告诉使用此功能的人他们做错了什么或是什么原因错误甚至是从哪里来的。我只是为了回复而缩短了它,在我的代码中我仍然有错误消息。至于
var io=require(“到您的模块的路径”).getIO();
var ioServer=require('../socketio\u listener/socketIoListener');ioServer.getIO()
应该完全做到这一点。至少我通常是这样从其他文件导入内容的。路径是正确的,我只是仔细检查了一下。还有什么我可能遗漏的吗?@Markus-ah,我发现了一个问题。你必须在
module.exports.getIO=function(){…}之前将赋值移动到
module.exports.getIO=function(){…}
因为构造函数分配替换了整个模块。如果您先执行了getIO分配,则导出的对象将终止getIO分配。请参阅我的代码以了解正确的顺序。我自己刚刚发现了这一点,并想知道为什么它现在可以工作,感谢您的澄清和帮助!