gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 22:22:27 25 4
gpt4 key购买 nike

在 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 中执行此操作?

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

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

第三种方法是将其设置为某个全局变量,该变量只能由当前 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 生成器。当然,您必须将这些 guid 存储在某个地方,并且根据您的操作方式,您最终可能会造成扩展瓶颈。

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com