我对使用require()
在ExpressJS中导入软件包感到困惑。
我包括一些包裹,例如本地nodemailer
,bcryptjs
,即在函数内部调用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.js
或app.js
?
但是有些像require('ObjectID')
这样的情况并没有经常使用。全球需要这样的包也会好吗?
感谢。
答案 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等等。