草庐IT

javascript - NodeJS Express 中每个请求的全局范围

coder 2024-07-23 原文

我有一个基本的快速服务器,需要在每个请求处理期间存储一些全局变量。 更深入地说,请求处理涉及许多需要存储在变量中的操作,例如 global.transaction[]

当然,如果我使用 global 范围,每个连接都将共享其事务的信息,我需要一个全局范围,因为我需要在执行期间从许多其他模块访问事务数组。

关于这个问题有什么建议吗?我觉得这是非常微不足道的事情,但我正在寻找复杂的解决方案:)

非常感谢!

更新 这是一个案例场景,更清楚。

在每个请求中,我有 3 个模块(ModuleAModuleBModuleC)读取一个目录中 10 个随机文件的内容。我想跟踪每个请求读取的文件名列表,并用 res.write 发送回列表。

所以 ModuleA/B/C 需要访问一种全局变量,但是列表 request_1, request_2, request_3 等等...不必混淆。

最佳答案

这是我的建议避免全局状态如火

  • 根据我的经验,这是 Node 服务器中的头号维护问题。
  • 它使您的代码不可组合且更难重用。
  • 它会在您的代码中创建隐式依赖关系 - 您永远无法确定哪一部分依赖于哪一部分,而且验证起来也不容易。

您希望应用程序的每一部分使用的代码部分尽可能明确。这是一个问题。

问题

我们希望跨多个请求同步状态并相应地采取行动。这是编写软件中的一个非常大的问题——有人说甚至是最大的问题。应用程序中对象通信方式的重要性怎么估计都不为过。

一些解决方案

有几种方法可以在 Node 服务器中实现跨请求或服务器范围的共享状态。这取决于你想做什么。以下是两种最常见的 imo。

  1. 我想观察请求的作用。
  2. 我希望一个请求根据另一个请求所做的事情来做事。

1。我想观察请求做了什么

同样,有很多方法可以做到这一点。这是我最常看到的两个。

使用event emitter

这种方式请求发出事件。应用程序读取请求触发的事件并相应地了解它们。应用程序本身可以是您可以从外部观察到的事件发射器。

你可以这样做:

request.emit("Client did something silly", theSillyThing);

然后如果您愿意可以从外面听。

使用观察者模式

这就像一个事件发射器,但相反。您保留请求的依赖项列表,并在请求中发生有趣的事情时自行调用它们的处理程序方法。

就个人而言,我通常更喜欢事件发射器,因为我认为它们通常能更好地解决问题。

2。我希望一个请求根据另一个请求所做的事情来做事。

这比仅仅聆听要复杂得多。同样,这里有几种方法。他们的共同点是我们把分享放在一个service

与其拥有全局状态 - 每个请求都可以访问服务 - 例如,当您读取文件时通知服务,当您需要读取文件列表时 - 您询问服务。依赖关系中的一切都是明确的。

该服务不是全局的,只是它的依赖项。例如,它可以协调资源和数据,是 Repository 的某种形式。 ).

不错的理论!那么我的用例呢?

对于您的情况, 会做些什么,这里有两个选项。这远非唯一的解决方案。

第一个选项:

  • 每个模块都是一个事件发射器,每当它们读取文件时都会发射一个事件。
  • 服务会监听所有事件并保持计数。
  • 请求可以显式访问该服务,并可以查询它以获取文件列表。
  • 请求通过模块本身而不是添加的服务执行写入。

第二个选项:

  • 创建一个拥有 module1、module2 和 module3 副本的服务。 (作文)
  • 服务根据对它的要求将操作委托(delegate)给模块。
  • 该服务会保留自通过它发出请求以来访问过的文件列表。
  • 请求停止直接使用模块 - 而是使用服务。

这两种方法各有优缺点。可能需要一个更复杂的解决方案(这两个在实践中非常简单),其中服务被进一步抽象,但我认为这是一个好的开始。

关于javascript - NodeJS Express 中每个请求的全局范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19925857/

有关javascript - NodeJS Express 中每个请求的全局范围的更多相关文章

  1. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  2. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  3. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  4. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  5. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  6. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  7. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  8. Ruby 日期参数超出范围 - 2

    我正在尝试使用在我的代码中是动态的Time.local来安排时间。在每个月的第一天,我传递的值是Time.local(2009,9,-1,0)。在PHP中,这会将时间设置为上个月的最后一天。在ruby​​中,我只是得到“ArgumentError:参数超出范围”。是我用错了方法还是什么?谢谢。 最佳答案 您应该使用DateTime类而不是Time。(您可能需要先require'date'并安装activesupportgem。)它比Time更通用,并且可以用DateTime.civil(2009,9-1,-1,0)做你想做的事。为天

  9. ruby - 将n维数组的每个元素乘以Ruby中的数字 - 2

    在Ruby中,是否有一种简单的方法可以将n维数组中的每个元素乘以一个数字?这样:[1,2,3,4,5].multiplied_by2==[2,4,6,8,10]和[[1,2,3],[1,2,3]].multiplied_by2==[[2,4,6],[2,4,6]]?(很明显,我编写了multiplied_by函数以区别于*,它似乎连接了数组的多个副本,不幸的是这不是我需要的)。谢谢! 最佳答案 它的长格式等价物是:[1,2,3,4,5].collect{|n|n*2}其实并没有那么复杂。你总是可以使你的multiply_by方法:c

  10. ruby - 在 RSpec 中 stub /模拟全局常量 - 2

    我有一个gem,它有一个根据Rails.env的不同行为的方法:defself.envifdefined?(Rails)Rails.envelsif...现在我想编写一个规范来测试这个代码路径。目前我是这样做的:Kernel.const_set(:Rails,nil)Rails.should_receive(:env).and_return('production')...没关系,只是感觉很丑。另一种方法是在spec_helper中声明:moduleRails;end而且效果也很好。但也许有更好的方法?理想情况下,这应该有效:rails=double('Rails')rails.sho

随机推荐