2013-05-28 86 views
3

我正在构建一个服务,在必要时需要多个模块之间分割。 我需要从我的所有模块中的路由器访问“请求”变量。将变量传递到所有模块

我当前的解决方案(其已经提出在其他线程用于一般传递变量)是将它传递给每个必需的模块:

变种a_module =要求(“./ a_module”)(REQ) ;

和出口各个模块的功能:

module.exports =功能(REQ){ ... }

但它是繁琐,涉及不必导出我的模块作为函数,并且只能在导出函数的范围内访问此变量。理想情况下,我希望能够在整个所需模块中访问变量。

有没有其他优雅的方式来做到这一点,我失踪了?像在整个应用程序中声明req变量为全局一样?

+0

您是使用Express还是只使用普通的NodeJS? –

+0

是的,我正在使用Express – gwendall

+1

与PHP不同,节点在同一进程中异步处理多个请求。如果将'req'设置为全局的,并且同时处理了多个请求,那么'req'就会被破坏,所以我认为除非它们是常量和通用的,否则我不认为应该使用全局变量。 –

回答

3

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

您需要退后一步,问自己是否真的写了很多需要访问请求对象的模块。我不认为你有。你应该写的是能够接收他们需要的特定数据的函数 - 不多也不少。所有这些功能几乎肯定不需要整个请求。例如,他们中有多少人真的需要访问每个HTTP头?将您的程序看作一组关于域对象/数据的操作。例如,也许有一种功能需要用户帐户记录并将其从普通用户推荐给管理员。所有该功能需要的是用户帐户。它不应该耦合到HTTP请求对象。

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

+0

非常好的答案,谢谢! – gwendall