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