如何在Express中全局提供模块(如bcrypt)?

时间:2017-06-03 15:59:14

标签: javascript node.js express

我有几个“路径”文件,我导入这样的模块:

var bcrypt = require('bcryptjs');

我试图通过将bcrypt导入我的主应用程序js然后使用app.use()这样的全局来使全局可用:

var bcrypt = require('bcryptjs');
app.use(bcrypt); // clearly not right, app crashes

我在这里尝试过各种各样的事情。我是否应该坚持将其单独导入每个文件中,或者是否有一种方法可以使该模块在全球范围内可用?

2 个答案:

答案 0 :(得分:3)

app.use只适用于Express中间件,bcrypt不是,它只是一个常规的Node.js模块。

正如评论中所指出的那样,没有任何理由让您不应该只使用require使bcrypt在任何需要它的模块中可用。

对于它的价值,你可以使用全局可用的变量global在Node.js中创建一个全局变量。

在您的示例中,它会像这样使用(但同样, NOT WOMMENDED ):

var bcrypt = require('bcryptjs');
global.bcrypt = bcrypt;

答案 1 :(得分:1)

虽然您已经接受了答案,但我想我会更多地描述您为什么不想使用全局以及为什么它只是{{{{{{{{{{{{{{{{{{{{{{{{ 1}}在您需要的每个模块中。

模块背后的概念是,您应该努力使每个模块尽可能独立可用。本着这种精神,你根本没有理由让模块依赖于前一个模块初始化一些全局变量。这只是使一个模块依赖于与其他模块的加载的确切顺序,破坏了独立使用该模块的能力并且建立了潜在的全局变量命名冲突。

node.js中模块设计的一个重要设计目标是避免使用全局变量。相反,模块应该只需要require(),或者可以在加载时从其他模块传递所需的数据,或者通过调用其他模块中的方法来查询其他模块的共享数据。

此外,缓存加载require()的模块。因此,只有第一次使用require()加载模块时才会从磁盘加载并执行。每次加载时,都会立即返回先前加载的模块对象。因此,从需要访问模块的各种模块中多次加载模块几乎不需要任何费用。

因此,每个需要访问bcrypt的模块都应该这样做:

require()

是的,这导致在每个模块的顶部重复一些事情,并且有时候感觉比一般的努力要少一些干,但总体上是一个更好的权衡,因为它使模块尽可能独立因为每个模块独立地指定它所依赖的其他模块,并且不使用全局变量来执行此操作。