在NodeJS(ExpressJS)中本地或全局使用'require()'吗?

时间:2016-11-04 10:37:55

标签: javascript node.js express

我对使用require()在ExpressJS中导入软件包感到困惑。 我包括一些包裹,例如本地nodemailerbcryptjs,即在函数内部调用require。所以,我必须在单个路径文件中多次require

一位同事建议所有require语句只能在该路由文件的顶部或app.js文件中出现一次。我有点困惑。有人可以建议在middlwares中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.jsapp.js? 但是有些像require('ObjectID')这样的情况并没有经常使用。全球需要这样的包也会好吗?

感谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 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等等。