我有一个基本的快速服务器,需要在每个请求处理期间存储一些全局变量。
更深入地说,请求处理涉及许多需要存储在变量中的操作,例如 global.transaction[]
当然,如果我使用 global 范围,每个连接都将共享其事务的信息,我需要一个全局范围,因为我需要在执行期间从许多其他模块访问事务数组。
关于这个问题有什么建议吗?我觉得这是非常微不足道的事情,但我正在寻找复杂的解决方案:)
非常感谢!
更新 这是一个案例场景,更清楚。
在每个请求中,我有 3 个模块(ModuleA、ModuleB、ModuleC)读取一个目录中 10 个随机文件的内容。我想跟踪每个请求读取的文件名列表,并用 res.write 发送回列表。
所以 ModuleA/B/C 需要访问一种全局变量,但是列表 request_1, request_2, request_3 等等...不必混淆。
最佳答案
这是我的建议避免全局状态如火。
您希望应用程序的每一部分使用的代码部分尽可能明确。这是一个大问题。
我们希望跨多个请求同步状态并相应地采取行动。这是编写软件中的一个非常大的问题——有人说甚至是最大的问题。应用程序中对象通信方式的重要性怎么估计都不为过。
有几种方法可以在 Node 服务器中实现跨请求或服务器范围的共享状态。这取决于你想做什么。以下是两种最常见的 imo。
同样,有很多方法可以做到这一点。这是我最常看到的两个。
这种方式请求发出事件。应用程序读取请求触发的事件并相应地了解它们。应用程序本身可以是您可以从外部观察到的事件发射器。
你可以这样做:
request.emit("Client did something silly", theSillyThing);
然后如果您愿意可以从外面听。
这就像一个事件发射器,但相反。您保留请求的依赖项列表,并在请求中发生有趣的事情时自行调用它们的处理程序方法。
就个人而言,我通常更喜欢事件发射器,因为我认为它们通常能更好地解决问题。
这比仅仅聆听要复杂得多。同样,这里有几种方法。他们的共同点是我们把分享放在一个service
与其拥有全局状态 - 每个请求都可以访问服务 - 例如,当您读取文件时通知服务,当您需要读取文件列表时 - 您询问服务。依赖关系中的一切都是明确的。
该服务不是全局的,只是它的依赖项。例如,它可以协调资源和数据,是 Repository 的某种形式。 ).
对于您的情况,我 会做些什么,这里有两个选项。这远非唯一的解决方案。
第一个选项:
第二个选项:
这两种方法各有优缺点。可能需要一个更复杂的解决方案(这两个在实践中非常简单),其中服务被进一步抽象,但我认为这是一个好的开始。
关于javascript - NodeJS Express 中每个请求的全局范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19925857/
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
请帮助我理解范围运算符...和..之间的区别,作为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)是
我正在尝试从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
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我正在尝试使用在我的代码中是动态的Time.local来安排时间。在每个月的第一天,我传递的值是Time.local(2009,9,-1,0)。在PHP中,这会将时间设置为上个月的最后一天。在ruby中,我只是得到“ArgumentError:参数超出范围”。是我用错了方法还是什么?谢谢。 最佳答案 您应该使用DateTime类而不是Time。(您可能需要先require'date'并安装activesupportgem。)它比Time更通用,并且可以用DateTime.civil(2009,9-1,-1,0)做你想做的事。为天
在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
我有一个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