5

我刚刚开始使用 node.js 并通过http://nodebeginner.org/index.html运行。很棒的入门教程,但我真的很想知道是否可以将请求和响应都设为“全局”,以便为当前传入请求加载的任何模块都可以访问这些……而不是注入。

想法?

4

5 回答 5

5

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

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

于 2011-08-31T20:05:58.853 回答
2

由于异步事件循环,理论上可以使请求和响应变量全局可用......但是,一旦您从当前上下文返回(即使在调用其他异步内容时),队列中的下一个事件将是执行。

现在想想同时连接的另一个 HTTP 客户端。它将再次更改全局变量,您将失去旧的。所以最后,你的方法正在泄漏。

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

于 2011-08-31T20:30:53.737 回答
2

节点域。

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

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

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

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

示例 没有这个,通过多层代码跟踪单个请求变得不可能,除非您将您的请求(或请求 ID)暴露给它不属于的层。(即服务、DAL 等......将您的请求保留在您的控制器中(如果它属于它)。

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

在你开始尖叫之前,是的,我知道域从节点 5 开始已被弃用,而且我也知道这不是域的确切用例,因为它记录在案。但是 Node 现在正在敲定一个新的 API,希望能继续解决这个问题。

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

于 2016-02-29T19:23:28.390 回答
1

continuation-local-storage解决了这个问题。如果我理解正确,则与域有一些相似之处,只是它不会被弃用。:D

这篇文章稍微解释一下。以及相关的幻灯片

于 2016-03-22T20:18:52.647 回答
0

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

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

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

于 2011-08-31T20:39:23.670 回答