2

在 Rails 中,当前线程被大量用于存储全局变量(我知道,全局变量是邪恶的,但它们有时是必要的)。

Thread.current[:authlogic_scope] = scope

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

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

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

在 express 中,您将回调与请​​求/响应对象一起使用,以避免必须设置全局变量,这是有道理的:

var express = require('express');
var app = express.createServer();

app.get('/', function(request, response) {
  response.send('Hello World');
});

这个问题是关于构建用于缓存数据库记录的“身份映射”(范围为当前 HTTP 请求/当前用户)。在 Rails 中,他们可以通过保持身份映射范围为 来做到这一点Thread.current,因为一切都是同步的。有没有办法在 Node.js 中做到这一点?

一种方法是将request周围传递给每个函数。对于我的特殊情况,这太复杂了,如果可能的话,我想避免这种情况。

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

第三种方法是将其设置为仅当前 HTTP 请求或当前线程可访问的某个全局变量。这在 Node.js 中可行吗?如果不是,还有什么其他方法可以完成同样的事情?

基本上,我希望能够做到

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

并让它在内部检查一些process.CURRENT_REQUEST范围为当前请求的node.js,App.User查询可以在其中存储它的结果(并且任何其他模型都可以存储它们的结果,因此如果再次请求它们,它不会命中数据库)。我还希望能够currentUser像 Authlogic 一样进行传递,因此每当创建记录时,例如,该createdById字段将被设置为process.CURRENT_REQUEST.currentUser自动(内部)。

4

1 回答 1

2

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

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

您尚未提供构建此身份映射的强大用例。你能详细说明吗?

如果您确实需要跟踪单个回调,则可以使用 guid-generator。当然,您必须将这些指南存储在某个地方,并且根据您的操作方式,您最终可能会造成扩展瓶颈。

啊..我现在看到您的编辑...您在哪里写“ App.User 查询可以存储其结果的位置(并且任何其他模型都可以存储其结果,因此如果再次请求它们,它不会命中数据库)。 " 你已经在一个非常高的水平上思考。这不是一个 node.js 问题,而是一个框架问题。我的意思是,node.js 是一个低级工具包,将自己作为高级框架推销。它基本上是一个带有线程池支持的事件循环的 javascript 混搭。顺便说一句,那将是操作系统线程。我认为您的问题的答案可能是,如果您希望避免对数据库造成额外的打击,您需要在对象中明确提供缓存。据我所知,节点中没有高级魔法。我知道这真的没有帮助,

回复:全局变量。只是不要这样做。朋友不要让他们的朋友写信给全球。:)

于 2012-07-23T22:01:48.933 回答