在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。 只是不要这样做。 朋友不要让他们的朋友写给全球。 🙂
- 如何检查节点js中是否设置了环境variables?
- 节点启动脚本内的引用环境variables
- 在npm-scripts中传递环境variables
- 套接字io获取断开连接的套接字的ID
- export NODE_ENV =生产不会改变gulpfile.js中的process.env.NODE_ENV
- Brunch将NODE_ENV或环境variables暴露给javascript
- JavaScript / Node.JS中的variables声明和初始化
- grunt-ng-constant不会生成configuration脚本
- node.js在res.writeHeads()函数内使用一个variables