【问题标题】:Accessing the currently executing "request" or "thread" as if it were global in Node.js?访问当前正在执行的“请求”或“线程”,就好像它在 Node.js 中是全局的一样?
【发布时间】:2012-07-23 21:56:43
【问题描述】:

在 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()

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

【问题讨论】:

    标签: javascript ruby-on-rails node.js global-variables process


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 你建议我怎么称呼它?我明白你在说什么,但对于我的特殊情况,将请求到处传递是不可取的(附加到问题中)。有没有办法跟踪 Node.js 中的进程/线程/无论它们调用什么来避免传递请求?
    • 如果能大致了解 Node.js 中的执行代码是如何执行的、如何在回调等之间跳转以及它是否存储某种进程 ID 或其他内容,那就太好了。
    • 我同意避免使用全局变量是一件好事。但是,如果您真的查看源代码,我会说,全局变量是使 Rails 成为可能(干净的 api)的主要因素之一。例如,它们是进行数据库查询的基础。
    • 很好的元问题。您正在谈论 HTTP 请求、HTTP 方法的请求处理程序(例如 GET、POST 等)或传递给请求处理程序的回调函数——这可能是您原始示例中的匿名函数.
    • 关于 node.js 事件循环如何工作的 node.js 邮件列表上有很好的讨论。当你开始理解它时,大部分的魔力和炒作将被“哦,是的,这很酷,我明白了”所取代。除了阅读 node.js 列表中的旧帖子之外,我没有太多建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多