2011-08-31 108 views

回答

4

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

因此,尽管您认为在任何给定时间只有1个请求和响应,但实际上对所有当前客户端都有打开的请求。

+1

你说的是正确的,但你实际上可以使用节点域来实现他所要求的。请参阅下面的帖子。 – CBP

+0

我想这个答案只是重申了这个问题。有选项。域和连续本地存储。公平地说,我不确定这些选项在发布时是否可用。 – tybro0103

2

由于异步事件循环,理论上可以使请求和响应varibale全局可用......但是,只要从当前上下文返回(即使调用其他异步事件),下一个事件在该队列将被执行。

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

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

0

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

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

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

2

节点域。

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

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

全局变量通常被认为使用不好,因为它们破坏了封装并且正确封装的应用程序是优秀设计的第一个构建块,因为应用程序将更易于阅读,测试和重构。

这就是说,我个人遇到很多很好的使用情况在单个请求的范围内使用全局变量。

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

基本上,通过多层传递变量,以便它们可以在我的应用程序的较低级别访问是不可持续的,并且使代码非常混乱。

在您开始尖叫之前,我知道Domains从Node 5开始已被弃用,而且我也意识到这不是Domain的确切用例,因为它已记录在案。但是Node现在正在完成一个新的API,希望能继续解决这个问题。

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