草庐IT

javascript - Express - 在中间件函数之间传递数据的更好模式

coder 2025-02-22 原文

我刚刚在 Express 中提出了这个问题,我对 StackOverflow 对此的看法很感兴趣:

https://github.com/strongloop/express/issues/2831

我的问题是为什么 Express 选择不允许开发人员在中间件函数之间直接传递数据,并且基本上强制您将临时数据分配给请求对象,我一直认为这是一个非常尴尬的事情作业。

更具体地说:

在中间件函数之间传递数据通常涉及这样做

req.specialData = {}
next();

但是,如果可能的话,它可能会更容易且性能更高(!)

next(null,data);

function mySpecialMiddleWare(req,res,next,data){}

//现在,调用上面的函数

mySpecialMiddleWare(req,res,next, {some:data});

问题 是 Express 使用了一种我认为是愚蠢的方法来确定调用是正常的中间件函数还是下一个错误的第一个中间件函数,方法是检查是否function.length > 3 或 function.length === 4...

我说的有没有道理?

允许通过中间件函数直接传递数据而不是笨拙地将数据分配给 req 会更好/更容易/更快/更强吗??

也许 Express 已经具备此功能,我只是被误导了?

最佳答案

my question is why Express opts to disallow the developer from passing data directly between middleware functions and basically forces you to assign temporary data to the request object in what I have always considered to be a quite awkward assignment.

所以我认为 API 是鼓励大多数中间件模块化、可重用和松散耦合的方式。这意味着通常应该做一些事情而不必太担心其他中间件可能在它们之前或之后运行。为了实现这一点并创建一个松散兼容的中间件功能的生态系统,express 保持 API 相当通用。这有利也有弊。但作为对您第一个问题的直接回答,我会说要保持界面简单、一致和灵活,并尽量避免严格的顺序依赖性。

在您的情况下,中间件之间可能存在隐式依赖关系。另一个常见示例通常是您的 session 中间件具有隐式依赖性,即您的 cookie 中间件在它之前运行。将这些全部隐式化可能会导致错误和不必要的故障排除。另一方面,它使应用程序开发人员能够更轻松地混合和匹配中间件,否则这些中间件可能不会相互感知。

事后看来,我认为我和一些明确的维护者都会同意,出于语义 API 的原因使用函数元数(预期参数的数量)对 TJ 来说是一个奇怪而糟糕的选择。我认为如果要重写该项目,将为错误处理定义一个更明确的 API。

wouldn't it be better/easier/faster/stronger to allow direct passing of data via middleware functions instead of assigning data awkwardly to req ??

更好 - 这是非常有争议的和基于意见的。它的简单性有很多要说的,证据是巨大的生态系统和用途。有可用的替代方案,例如 hapi、restify 等,因此您可以考虑它们。

更容易 - 可能不是。那里的东西很简单。

更快 - 可能没有任何意义。不确定为什么您认为您的版本会更快,但最好在做出此类声明时提供指标。

更强——如果你说“更强”是指更明确的意思,那可能是真的,但有些人仍然更喜欢 JavaScript 是有原因的,即使 TypeScript 一直到 Haskell 都存在,并且在某种意义上肯定是“更强”的。

关于javascript - Express - 在中间件函数之间传递数据的更好模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34346898/

有关javascript - Express - 在中间件函数之间传递数据的更好模式的更多相关文章

  1. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. ruby-on-rails - 在 ruby​​ 中使用 gsub 函数替换单词 - 2

    我正在尝试用ruby​​中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了

  5. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  6. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  7. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  8. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  9. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  10. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

随机推荐