node.js使HTTP服务器的请求和响应全局?

我刚刚开始使用node.js并运行http://nodebeginner.org/index.html 。 伟大的启动教程,但我真的想知道是否有可能使请求和响应'全球',所以任何模块加载当前传入的请求可以访问这些…而不是注入。

想法?

与大多数Web脚本语言不同,在Node中,来自不同客户端的许多HTTP请求可以同时处于“活动”状态。 你怎么知道你在回应哪个客户?

所以,当你认为在任何时候只有一个请求和响应,实际上有所有当前客户的请求。

由于asynchronous事件循环,理论上可以使全局可用的请求和响应varibale …但是,只要从当前上下文返回(即使调用其他asynchronous的东西),队列中的下一个事件执行。

现在想想另外一个HTTP客户端正在连接。 它会再次改变全局variables,你会失去你的旧的。 所以最后你的方法漏了。

只有一个线程执行你自己的代码,一切显然是线程安全的。 但是你仍然需要防止无效的状态(variables等),因为你永远不知道下一个要执行的事件/callback是什么。

节点域。

这是一个古老的问题,我意识到,但是没有一个答案是完全正确的。

事实是,您可以通过使用节点域来实现此function。

全局variables通常被认为是不好用的,因为它们破坏了封装,而一个正确封装的应用程序是优秀devise的第一个构build块,因为应用程序将更易于阅读,testing和重构。

话虽如此,我个人遇到了很多很好的用例,在单个请求的范围内使用全局variables。

示例除非您将请求(或请求标识)暴露给它不属于的层,否则无法通过多层代码跟踪单个请求。 (即服务,DAL等…保持你的请求在你的控制器是属于的)。

基本上,将variables传递给许多图层,以便在应用程序的较低层访问variables是不可持续的,并且使代码非常混乱。

在你开始尖叫之前,是的,我知道Domains从Node 5开始已经被弃用了,而且我也知道这不是Domains的确切用例。 但是Node现在正在完成一个新的API,希望能继续解决这个问题。

https://nodejs.org/api/domain.html

continuation-local-storage解决了这个问题。 如果我理解正确的话,与域有一些相似之处,但是,这并没有被废弃。 :d

这篇文章解释了一下。 和相关的幻灯片 。

它应该是可能的,但是这将需要一个数组来保存对响应和请求对象的引用。 然后你将不得不告诉模块的索引在哪里find数组中的对象。 你也将不得不清理数组。 所以你不能真的避免将一些信息传递给模块。

最好将请求和响应对象引用直接传递给模块。

请记住,对象是通过引用传递的,因此在将对象传递给函数/模块时没有太大的开销。