javascript - 访问当前正在执行的 "request"或 "thread"就好像它是 Node.js 中的全局变量一样?

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

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

Thread.current[:authlogic_scope] = scope

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

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

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

在 Express 中,您使用带有请求/响应对象的回调来避免设置全局变量,这是有道理的:

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

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

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

一种方法是将请求传递给每个函数。对于我的具体情况,这太复杂了,无法做到,如果可能的话,我想避免这种情况。

另一种方法是重新定义要在自定义 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 是单线程的,因此 Node 也是单线程的。 我无意挑剔,但如果您使用他们学到的术语,人们会更好地理解您。 “线程”和“进程”这两个词在操作系统级别已经过于沉重,最好避免使用它们,除非这确实是我们的意思。

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

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

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

啊..我现在看到你的编辑...你写的“App.User查询可以存储其结果的地方(任何其他模型都可以存储其结果,所以如果再次请求它们,它不会命中数据库)。”你已经在很高的层次上思考了。这不是一个 Node.js 问题,而是一个框架问题。我的意思是,node.js 是一个低级工具包,但将自己定位为高级框架。它基本上是 JavaScript 与线程池支持的事件循环的混搭。顺便说一下,那将是操作系统线程。我认为您问题的答案可能是,如果您希望避免对数据库的额外命中,则需要在对象中显式提供缓存。据我所知, Node 中没有高级魔法。我知道这并没有什么帮助,只是也许可以说不要因为找不到不存在的东西而感到难过。

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

关于javascript - 访问当前正在执行的 "request"或 "thread"就好像它是 Node.js 中的全局变量一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11621158/

相关文章:

Javascript,合并数组元素

ruby-on-rails - Rails gem "friendly_id": How to get a live preview of the slug, 在它的对象被创建之前

ruby-on-rails - 帮助我发现一些 Ruby 代码中的一些有趣语法

node.js - 引用Mongoose多个文档

javascript - 如何在 Adob​​e Air Extension for Dreamweaver 3.3 下的 Javascript 中获取鼠标坐标?

javascript - 将文本样式应用于谷歌工作表单元格中的正则表达式模式

ruby-on-rails - 将模型放入另一个模型时缺少部分

javascript - 如何在 Node.js 中追加到 Buffer

jquery - Node.js 上的 Javascript 框架

javascript - Angular GET 请求错误,但仅限于 Safari iOS