3

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

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

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

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

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

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

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

4

1 回答 1

3

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

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

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

于 2013-05-28T02:28:36.680 回答