【发布时间】:2011-11-07 22:18:36
【问题描述】:
我刚刚开始使用 node.js 并浏览了 http://nodebeginner.org/index.html。很棒的入门教程,但我真的很想知道是否可以将请求和响应都设为“全局”,以便为当前传入请求加载的任何模块都可以访问这些...而不是注入。
想法?
【问题讨论】:
标签: javascript node.js httpserver
我刚刚开始使用 node.js 并浏览了 http://nodebeginner.org/index.html。很棒的入门教程,但我真的很想知道是否可以将请求和响应都设为“全局”,以便为当前传入请求加载的任何模块都可以访问这些...而不是注入。
想法?
【问题讨论】:
标签: javascript node.js httpserver
与大多数 Web 脚本语言不同,在 Node 中,来自不同客户端的许多 HTTP 请求可以同时处于“活动”状态。你怎么知道你在回复哪个客户?
因此,尽管您认为在任何给定时间只有 1 个请求和响应,但实际上所有当前客户都有未处理的请求。
【讨论】:
由于异步事件循环,理论上可以使请求和响应变量全局可用......但是,一旦您从当前上下文返回(即使调用其他异步内容),下一个事件在队列将被执行。
现在想想另一个 HTTP 客户端同时连接。它将再次更改全局变量,您将失去旧的。所以最后,你的方法正在泄漏。
只有一个线程执行您自己的代码,一切显然都是线程安全的。但是您仍然必须防止无效状态(变量等),因为您永远不知道下一个要执行的事件/回调是什么。
【讨论】:
节点域。
这是一个老问题,我知道,但没有一个答案是完全正确的。
事实上,您可以通过使用节点域来实现此功能。
全局变量通常被认为不适合使用,因为它们破坏了封装,而正确封装的应用程序是良好设计的第一个构建块,因为应用程序更易于阅读、测试和重构。
话虽如此,我个人遇到过许多在单个请求范围内使用全局变量的好用例。
示例 没有这个,通过多层代码跟踪单个请求变得不可能,除非您将请求(或请求 ID)暴露给它不属于的层。 (即服务、DAL 等...将您的请求保留在您的控制器中)。
基本上,通过多层传递变量以便在我的应用程序的较低级别访问它们是不可持续的,并且会使代码非常混乱。
在您开始尖叫之前,是的,我知道域从节点 5 开始已被弃用,而且我也知道这不是域的确切用例,因为它已记录在案。但 Node 现在正在敲定一个新的 API,希望能继续解决这个问题。
【讨论】:
continuation-local-storage 解决了这个问题。如果我理解正确,则与域有一些相似之处,只是它不会被弃用。 :D
This post 稍微解释一下。还有related slideshow。
【讨论】:
这应该是可能的,但这需要一个数组来保存对响应和请求对象的引用。 然后你必须告诉模块索引在哪里可以找到数组中的对象。此外,您还必须清理阵列。所以你不能真正避免将一些信息传递给模块。
最好将请求和响应对象引用直接传递给模块。
请记住,对象是通过引用传递的,因此将对象传递给函数/模块时不会产生很大的开销。
【讨论】: