在Node.js中访问当前正在执行的“请求”或“线程”,就好像它是全局的一样?

在Rails中,当前线程被用来存储全局variables(我知道,全局variables是邪恶的,但有时是必要的)。

Thread.current[:authlogic_scope] = scope 

以下是一些使用它的地方:

  • active_record / scoping.rb#L18
  • authlogic /会话/ activation.rb#L29

问题是,你可以在Node.js中做类似的事情吗? 具体来说,在一个快速应用程序

保持对当前请求(或当前线程)的引用的最佳方式是什么?

在expression式中,您正在使用请求/响应对象的callback来避免设置全局variables,这是有道理的:

 var express = require('express'); var app = express.createServer(); app.get('/', function(request, response) { response.send('Hello World'); }); 

这个问题是关于build立一个用于caching数据库logging(限定在当前HTTP请求/当前用户)的“身份映射”。 在Rails中,他们可以通过保持身份映射的作用域为Thread.current ,并且因为所有事物都是同步的。 有没有办法在Node.js中做到这一点?

一种方法是将request传递给每个函数。 对于我个人而言,这样做太复杂了,我想尽可能避免这种情况。

另一种方法是重新定义您要在自定义JavaScript函数中使用的所有variables,类似于您查看模板的方式(使用模板定义感觉像全局variables的variables)。 但是对于我的特殊情况来说,这会比有帮助的更困惑。

第三种方法是将其设置为只能由当前HTTP请求或当前线程访问的某个全局variables。 这是可能的Node.js? 如果没有,还有什么其他方法可以完成同样的事情?

基本上,我希望能够做到

 App.User.where({createdAt: {'>=': _(2).days().ago()}}).all() 

并让它在内部检查一些node.js的process.CURRENT_REQUEST ,它的作用域是当前的请求, App.User查询可以存储它的结果(以及任何其他模型可以存储它们的结果,所以如果它们被再次请求,它不会命中数据库)。 我也希望能够以与Authlogic相同的方式传递当前用户,所以无论何时创build一个logging,createdById字段将被自动(内部)设置为process.CURRENT_REQUEST.currentUser

你不是说话。 JavaScript是单线程的,所以节点是单线程的。 我并不是说挑剔,但是如果你使用他们所学的术语,人们会更好地理解你。 “线程”和“进程”这两个词在操作系统级别上已经太重了,所以最好避免它们,除非这真是我们的意思。

在节点中传递整个请求对象是很常见的。

您还没有提供强大的用例来构build这个身份地图。 你能详细点吗?

如果你真的需要跟踪个别的callback,你可以使用一个GUID生成器。 当然,你必须把这些GUID存储在某个地方,取决于你如何做,最终可能会造成缩放的瓶颈。

啊..我现在看到你的编辑…你写的地方在哪里App.User查询可以存储它的结果(和任何其他模型可以存储他们的结果,所以如果他们再次要求,它不会击中数据库)。 “ 你已经在想很高的水平了。 这是一个node.js问题和更多的框架问题。 我的意思是,node.js是一个低级的工具包,它是一个高层框架。 这基本上是一个JavaScript的混搭,一个线程池支持的事件循环。 顺便说一下,这将是操作系统线程。 我认为你的问题的答案可能是你需要明确提供caching在你的对象,如果你想避免额外的命中数据库。 据我所知,对于节点来说没有高级的魔法。 我知道这并没有什么帮助,除非说不要找不到那些不在那里的东西。

Re:全局variables。 只是不要这样做。 朋友不要让他们的朋友写给全球。 🙂