【问题标题】:Passing variables to all modules将变量传递给所有模块
【发布时间】:2013-05-28 01:09:30
【问题描述】:

我正在构建一个服务,该服务分散在必要时需要的多个模块中。 我需要从我所有模块中的路由器访问“请求”变量。

我目前的解决方案(通常在其他线程中建议用于传递变量)是将其传递给每个所需的模块:

var a_module = require('./a_module')(req);

并将每个模块导出为函数:

module.exports = function(req) { ... }

但这很冗长,并且必须将我的模块导出为函数,并且只能在导出函数的范围内访问此变量。理想情况下,我希望能够访问整个所需模块中的变量。

还有其他我想念的优雅方式吗?就像在整个应用程序中将 req 变量声明为全局变量一样?

【问题讨论】:

  • 你使用的是 Express 还是普通的 NodeJS?
  • Node 在同一个进程中异步处理多个请求,这与 PHP 不同。如果您将 req 设置为全局变量,并同时处理多个请求,那么 req 会被破坏,所以我认为您不应该使用全局变量,除非它们是常量和通用的。
  • 好的,谢谢。另一个问题:似乎我不能从函数内部要求我的模块 - 这里是 express 的 get() 函数。我分配给它的变量只是未定义的。但是,如果我在函数之外需要它,它就可以工作。有什么我做错了吗? (对不起,如果我遗漏了一个明显的观点,我刚刚开始使用节点)
  • 如果你为一个请求加载一个模块,你想在处理完请求后卸载它吗?除非你有这么多的模块,否则你会因为加载所有模块而耗尽内存,我真的认为最好在服务器启动时加载它们并保留它们。 Node 这么快的原因之一是它不会为每个请求从头开始重新启动;对特定请求不是唯一的工作只执行一次。我试图整理出一个好的答案,但我认为当前的系统已经做到了最好,至少就我的技能而言。
  • 如果您遇到此类问题,我会问您是否将代码碎片化得太远,可能需要再次查看您的设计。模块在节点中创建命名空间,如果您希望打破或规避该机制,那么感觉是时候审查和重构了。

标签: node.js


【解决方案1】:

这个问题将征求意见而不是答案,所以它不太适合堆栈溢出,但这是我的 0.02 美元。

您需要退后一步,问问自己是否真的编写了这么多需要访问请求对象的模块。我不认为你有。您应该编写的是获取所需特定数据的函数——不多也不少。所有这些功能几乎肯定不需要整个请求。例如,其中有多少人真正需要访问每个 HTTP 标头?将您的程序视为对域对象/数据的一组操作。例如,也许有一个功能可以获取用户帐户记录并将其从普通用户提升为管理员。该功能需要的只是用户帐户。它不应与 HTTP 请求对象耦合。

只需编写一堆清晰解耦的函数,这些函数接受少量精确参数并用它们做一些有用的事情。这称为“松散耦合”。然后将相关功能组组织成一个模块。这被称为“凝聚力”。然后使用一些“胶水”代码从 HTTP req 对象中提取必要的参数,并将它们作为参数传递给这些函数。这些相同的功能应该适用于命令行界面或其他非 HTTP 界面。如果您以这种方式对它们进行编码,而不是让每个模块的每一行都知道当前的 HTTP req 对象,它们将更容易理解、测试和更长寿。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2018-09-07
    • 2019-12-10
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    相关资源
    最近更新 更多