2016-11-04 105 views
0

我对使用require()在ExpressJS中导入包有困惑。 我包括一些软件包,例如nodemailer,bcryptjs,即在其内部调用require。所以,我不得不在require他们多次在一个单一的路线文件。在NodeJS(ExpressJS)中,'require()'应该在本地还是全局使用?

一位同事建议所有require语句应该只出现一次,无论是在该路由文件的顶部还是在app.js文件中。我有点困惑。有人可以建议在中间件内使用require包装的最佳方式。

示例代码: 假设例如我需要在中间件功能中发送电子邮件。我对这个代码,如下所示:

var nodemailer = require("nodemailer"); 
       var mailTransport = nodemailer.createTransport(); 
       var mailOptions = { 
        from: constants.mail_sender_email, 
        to: constants.user_won_recipient_mails, 
        subject: templateContext.subject, 
        text: subject + ".\n", 
        html: results.html 
       }; 

每次我需要发送一封电子邮件,我再次使用require('nodemailer')声明。我是否应该在该路线文件中需要一次,即index.js或可能在app.js? 但是,有些情况下,如require('ObjectID'),这是不经常使用。全球需要这样的软件包也会不错?

感谢。

+0

你同事最有可能是正确的,但是如果你不显示你的代码,我们不能告诉你。 – BetaRide

+1

[从应用程序初始化开始就不需要'模块](https://github.com/alanjames1987/Node.js-Best-Practices#never-require-modules-after-app-initialization) – str

+1

模块被缓存,所以没有通过多次包括某些东西来惩罚性能。 –

回答

0

那么这里就是一个例子。

http.createServer(yourCallback(req, res) 
{ 
    if(req.Host == "a") 
    { 
     require("moduleA")(req, res); 
    }else 
    { 
     require("moduleB")(req, res); 
    } 
}).listen(80); 

在这种情况下,服务器将选择使用哪个模块。例如,您有多个主机,并且您通过js模块创建该主机。所以你不需要将你的所有主机文件导入到应用程序中。完成后垃圾收集器将其拿走。

万一你知道你将要使用模块很多。那么你只需将其声明为全局模块。如fs,http等。

+0

当我们希望代码决定在哪种条件下需要哪个模块时,这非常有用。 对于文件的条件需求,这很好。 –

+0

感谢Anton,但是这解释了包括有条件的模块。虽然我的问题是我们是否应该更喜欢功能内部或路径文件顶部的'require' -ing模块,或者app.js. –

+0

@MohitBhardwaj thne它没关系。喜欢风格tbh。它就像C++中的namepsaces一样。你要么全局使用名称空间来调用,要么你始终使用前缀。同样在这里。模块缓存,不会打你的记忆。 –

1

require('requiredFile/requiredModule');返回文件的上下文,并从requiredFile或requiredModule中公开导出的模块。

如果您想在全局级别使用该模块并在app.use()中调用它,以便您可以在每次处理请求时使用它。

但是,如果你想在本地使用它来获得一个特定的文件,那么需要它在文件的顶部并将其缓存在一个变量中,然后在整个文件中使用该变量(类似于你在样本中写的内容代码)

+0

感谢您的解释Vishal。我仍然有点困惑。假设我有3个路由文件,所有这些文件在一些中间件中都需要'nodemailer'。我应该在app.js中还是在每个路径文件的顶部定义它? –

+1

如果您想在3个单独的文件中使用节点邮件程序,但是在每个请求中(作为中间件),则需要在单独的文件中使用它。 例如,有一些验证模块必须用于每个请求,然后它将在app.js中被需要。 –

相关问题