我正在构建一个服务,该服务在必要时需要的多个模块中分散。 我需要从我所有模块中的路由器访问“request”变量。
我当前的解决方案(通常在其他线程中建议传递变量)是将它传递给每个必需的模块:
var a_module = require('./ a_module')(req);
将每个模块导出为函数:
module.exports = function(req){ ... }
但它很冗长,需要将我的模块导出为函数,并且只能在导出函数的范围内访问此变量。理想情况下,我希望能够在整个所需模块中访问变量。
我还缺少其他优雅的方法吗?就像在整个应用程序中将req变量声明为全局变量一样?
答案 0 :(得分:3)
这个问题是征求意见而不是答案,所以它不适合堆栈溢出,但这是我的0.02美元。
你需要退后一步,问自己是否真的写了那么多需要访问请求对象的模块。我认为你没有。你应该写的是能够获取所需特定数据的功能 - 不多也不少。所有这些功能几乎肯定不需要整个请求。例如,有多少人确实需要访问每个HTTP标头?将您的程序视为域对象/数据上的一组操作。例如,可能有一个功能可以获取用户帐户记录并将其从常规用户提升为管理员。功能需要的只是用户帐户。它不应该耦合到HTTP请求对象。
只需编写一堆干净的解耦函数,这些函数可以获取少量精确参数并对它们执行一些有用的操作。这称为“松散耦合”。然后将相关功能组组织到一个模块中。这被称为“凝聚力”。然后使用一些“粘合”代码从HTTP req
对象中提取必要的参数,并将它们作为参数传递给这些函数。这些相同的函数应该适用于命令行界面或其他非HTTP接口。如果您以这种方式对它们进行编码,而不是每个模块的每一行都知道当前的HTTP req
对象,它们将更容易理解,测试和更长寿。