这是一个涉及单页网络应用程序的问题,我的问题以粗体显示。
警告: 我不是这个主题的专家,如果我对 HTTP 和 WebSockets 工作原理的理解有误,请纠正我。
我对 HTTP Restful API 工作原理的理解是它们是无状态的。我们使用 connect.session() 等工具在更高级别将某种类型的状态插入到我们的应用程序中。由于每个请求都是新的,我们需要一种方法来向服务器重新识别自己的身份,因此我们创建一个来回发送的唯一令牌。
Connect 的会话中间件以一种非常酷的方式为我们解决了这个问题。将其放入中间件堆栈中,整个应用程序的每个请求都附加了很棒的会话。加入一些握手,您就可以相当轻松地将会话信息传递到 socket.io,甚至更棒。使用 RedisStore 保存信息以将其与连接/快速应用程序解耦,这甚至更棒。我们在这里谈论双彩虹,太棒了。
因此,理论上您现在可以拥有一个不依赖于连接/会话的单页面应用程序,因为在处理 Websocket 时您不需要超过 1 个会话(初始握手)。 socket.io 已经让你可以轻松访问这个 sessionId,问题解决了。
代替此身份验证工作流程:
现在变成:
使用 connect 还能给我们带来什么好处?这是我常用的列表:
加载初始单页应用程序的代码将处理设置静态服务器和网站图标。像护照这样的东西实施起来可能会更棘手,但肯定不是不可能。我列出的其他内容并不重要,您可以轻松地为 Websockets 实现自己的调试记录器。
现在真的有什么可以阻止我们拥有一个基于 http 的 index.html 文件来封装 websocket 连接并且根本不依赖于 connect 吗? 如果您想要一个单页面应用程序,同时通过其自动神奇的回退提供跨浏览器支持,socket.io 真的能够在不设置自己的 HTTP Restful API 的情况下使这种类型的应用程序架构工作吗?
此时唯一真正的缺点是在客户端缓存结果,对吧?你不能为此合并本地存储吗?我认为为搜索引擎创建可索引/可爬行的内容页面并不是什么大不了的事——您基本上会创建一个从持久数据库创建静态 html 文件的工具,对吗?
查看 Derby 和 SocketStream。
我认为您要求的是创建一个具有动态变化内容的单个静态页面的网站是否合理(使用socket.io)。
答案是“是”,它可以工作。一些 Node.js Web 框架已经做到了这一点,尽管我不知道有哪个框架使用了 socket.io。