2016-11-04 1 views
0

У меня есть путаница относительно импорта пакетов в ExpressJS с использованием require(). Я включил некоторые пакеты, например. nodemailer, bcryptjs локально, то есть называть require на них внутри функций. Итак, я должен был до require их несколько раз в одном файле маршрута.Должен ли «require()» использоваться локально или глобально в NodeJS (ExpressJS)?

Коллега предположил, что все операторы require должны появляться только один раз, либо в верхней части этого файла маршрута, либо в файле app.js. Я немного смущен. Может кто-нибудь, пожалуйста, предложите лучший способ для require пакетов внутри middlwares.

Пример: Предположим, например, Мне нужно отправить электронное письмо в функцию промежуточного программного обеспечения. У меня есть код для этого, как указано ниже:

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 
       }; 

Everytime Мне нужно отправить по электронной почте, я снова использовать require('nodemailer') заявление. Должен ли я вместо этого требовать его один раз в этом файле маршрута, то есть index.js или, возможно, в app.js? Но тогда есть такие случаи, как require('ObjectID'), которые не используются очень часто. Хорошо ли было бы также глобально требовать такие пакеты?

Спасибо.

+0

Вы, скорее всего, правы, но мы не можем сказать для shure, если вы не показываете свой код. – 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

Спасибо Антону, но это объясняет, в том числе модули условно.Хотя мой вопрос заключается в том, следует ли нам предпочесть 'require' -ing модулей внутри функций или в верхней части файлов маршрутов или в app.js. –

+0

@MohitBhardwaj это не имеет значения. предпочтение стиля tbh. это похоже на имена в C++. вы либо вызываете с использованием пространства имен globaly, либо используете префикс все время. тоже самое. модули кэшируются и не попадут в вашу память. –

1

require ('requiredFile/requiredModule'); возвращает вам контекст файла и выставляет экспортированный модуль из requiredFile или requiredModule.

Если вы хотите использовать модуль на глобальном уровне, требуйте и вызовите его внутри app.use(), чтобы вы могли использовать его каждый раз при обработке запроса.

Но если вы хотите использовать его локально для определенного файла, тогда требуйте его в верхней части файла и кешируйте его в переменной, а затем используйте эту переменную во всем файле (аналогично тому, что вы написали в своем примере код)

+0

Спасибо за объяснение Vishal. Я все еще немного смущен. Предположим, у меня есть 3 файла маршрута, все они требуют «nodemailer» в некоторых средах. Должен ли я определить его в app.js или в верхней части каждого файла маршрута? –

+1

Если вы хотите использовать почтовую программу узла в трех отдельных файлах, но в каждом запросе (в качестве промежуточного программного обеспечения), тогда требуется его в отдельных файлах. Например, существует некоторый модуль auth, который должен использоваться при каждом запросе, тогда это потребуется в app.js. –