【发布时间】:2012-04-04 03:38:31
【问题描述】:
这是一个涉及单页网络应用程序的问题,我的问题以粗体显示。
警告: 我不是这方面的专家,如果我对 HTTP 和 WebSockets 工作原理的理解有误,请纠正我。
我对 HTTP RESTful API 工作原理的理解是它们是无状态的。我们使用 connect.session() 之类的工具将某种类型的状态插入到更高级别的应用程序中。由于每一个请求都是新的,我们需要一种方法来向服务器重新识别自己,因此我们创建了一个可以来回发送的唯一令牌。
Connect 的会话中间件以一种非常酷的方式为我们解决了这个问题。将其放入您的中间件堆栈中,您就会为整个应用程序的每个请求附加很棒的酱汁会话。进行一些握手,您可以相当轻松地将会话信息传递给 socket.io,甚至更棒。使用 RedisStore 保存信息以将其与您的连接/快速应用程序分离,它甚至更棒。我们在这里谈论双彩虹真棒。
所以现在理论上您可以拥有一个不依赖于连接/会话的单页应用程序,因为在处理 websocket 时您不需要超过 1 个会话(初始握手)。 socket.io 已经让你可以轻松访问这个 sessionId,问题解决了。
代替此身份验证工作流程:
- 从发布请求中获取电子邮件和密码。
- 通过电子邮件查询您选择的数据库以获取其密码哈希。
- 比较哈希值。
- 重定向到“确定!”或“不!”。
- 如果正常,则存储会话信息并让 connect.session() 处理大部分其余部分。
现在变成:
- 监听登录事件。
- 从事件回调中获取电子邮件和密码。
- 通过电子邮件查询您选择的数据库并获取其密码哈希。
- 比较哈希值。
- 发出“OK!”或“不!”事件。
- 如果可以,做一些我现在不会想到但同样的效果应该可能的事情吗?
使用 connect 还能让我们获得什么好处?以下是我常用的列表:
- 开发模式记录器
- 网站图标
- 正文解析器
- 静态服务器
- passport(一个依赖于 connect/express 的身份验证库,类似于everyauth 提供的)
加载初始单页应用程序的代码将处理设置静态服务器和网站图标。像护照这样的东西实施起来可能更棘手,但肯定不是不可能的。我列出的所有其他内容都无关紧要,您可以轻松实现自己的 websocket 调试记录器。
现在真的有什么阻止我们拥有一个基于 http 的 index.html 文件,该文件封装了一个 websocket 连接并且根本不依赖于连接吗? 如果您想要一个单页应用程序,同时通过其自动魔法回退提供跨浏览器支持,socket.io 真的能够在不设置自己的 HTTP RESTful API 的情况下使这种类型的应用程序架构工作吗?
此时唯一真正的缺点是在客户端缓存结果,对吗?你不能为此合并本地存储吗?我认为为搜索引擎创建可索引/可抓取的内容页面不会有什么大不了的——你基本上会创建一个从你的持久数据库创建静态 html 文件的工具,对吧?
【问题讨论】:
标签: node.js websocket express socket.io connect