Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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
Node.js 正在尝试保持页之间的socket.io连接相同。是否有一个框架允许我这样做?_Node.js_Express_Socket.io_Single Page Application - Fatal编程技术网

Node.js 正在尝试保持页之间的socket.io连接相同。是否有一个框架允许我这样做?

Node.js 正在尝试保持页之间的socket.io连接相同。是否有一个框架允许我这样做?,node.js,express,socket.io,single-page-application,Node.js,Express,Socket.io,Single Page Application,我正在创建一个使用Socket.io连接进行实时更新的Express应用程序。即使用户切换页面,我也希望保持Socket.io连接。看到这似乎是不可能的,我想知道是否有某种框架允许您拥有一个.html页面,并基于该模板生成页面(比如它的角度有多大)。Express是否存在这样的框架?我查看了Vue,但不确定它是否有效 我目前正在向用户发送静态html文件。非常感谢您对这个问题的任何帮助 提前谢谢 有一种方法可以访问请求中的socket.io实例 首先创建socket-io.js文件: const

我正在创建一个使用Socket.io连接进行实时更新的Express应用程序。即使用户切换页面,我也希望保持Socket.io连接。看到这似乎是不可能的,我想知道是否有某种框架允许您拥有一个.html页面,并基于该模板生成页面(比如它的角度有多大)。Express是否存在这样的框架?我查看了Vue,但不确定它是否有效

我目前正在向用户发送静态html文件。非常感谢您对这个问题的任何帮助


提前谢谢

有一种方法可以访问请求中的socket.io实例

首先创建socket-io.js文件:

const socketio = require('socket.io');
module.exports.io = (server) => {
   const io = socketio(server);
   io.on('connection', async function (socket, next) {
   });

   return io;
};
然后将其导入app.js文件:

const { createServer } = require('http');

const socketio = require('./services/socket_io').io;
const server = createServer(app);

const io = socketio(server);
app.use((req, res, next) => {
   // instance socketio to req object
   req.socket = io;
   next();
});
通过此配置,您可以在每个请求中使用套接字io实例

req.socket.emit("my_event", event)

我不会详细讨论html和css文件,因为这不是必需的。主页或父页(index.html)只需要这个javascript文件就可以建立socket.io-client连接

var io = io();

function get_socket() {
    console.log("Return socket connection to iframe page");
    return io;
}

// handles server telling client to change page url in iframe
io.on("page", (page) => {
    $("#iframepage").attr("src", page);
    console.log("Page change: " + page);
});
在html文件中,我包括jQuery和socket.io-client

当iframe加载javascript文件时,它们可以调用套接字连接的父页面,如下所示:

var socket = parent.get_socket();

更改iframe后,所有.on命令都将刷新。这对于单页应用程序来说非常好,当选项卡/浏览器或应用程序关闭时登录,即使服务器可以捕捉到断开连接事件。

我从未尝试过这一点,但您可能能够从建立WebSocket连接,然后让打开的页面与工作程序通信


粗略地看,浏览器似乎不支持Worker中的WebSocket,但这在几年前就得到了修复。如果没有打开的页面,你可以指望浏览器最终杀死你的工人(从而导致套接字连接),而且看起来有些浏览器可能会这样做,即使仍然有打开的页面,因此,您可能需要进行实验,以确定此方法是否足够可靠。

如果您的父HTML页面建立了socket.io连接,则您可以将页面发送到iframe,iframe可以检索父套接字连接。@WLGfx如果我理解正确,您建议在我的公用文件夹中有一个index.html文件,其中包含一个包含服务器发送的文件的iframe。由于重新加载的是iframe,而不是实际页面本身,因此socket.io连接应该保持不变。我理解正确了吗?是的,parents.js文件建立了socket.io.client连接,您可以从iframe调用parents函数来访问socket。我会给你举个例子。非常感谢你的快速回复!我按照你的建议做了,现在得到了以下错误:
TypeError:req.socket.destroy不是一个函数
。你知道怎么解决这个问题吗?如果有帮助的话,我可以发布我的代码。错误来自
\node\u modules\finalhandler\index.js:128
我设法修复了此错误,但不确定如何实施您的建议。我在客户端有一个socket.js文件,它创建了一个带有
io()
的套接字,然后我可以在其他脚本中使用它来发送消息。我希望保持套接字不变,因为我正在存储诸如用户名之类的变量,如果套接字刷新,则
socket.username
返回null。有没有其他方法可以解决这个问题?@MilanFerus Comelo看一看完整的例子谢谢!这也促使我使用Angular,这也有助于使用模板。