Вызов зависимости и вызов метода / функции внутри модуля - PullRequest
0 голосов
/ 21 февраля 2019

Заранее благодарю за помощь.

Я не уверен, как сделать следующее.У меня есть модуль для отправки электронных писем, и Config вводится в модуль с помощью внедрения зависимостей summon.js, но мне нужно использовать метод sendMail и передать ему параметр mailOptions.Вот пример кода:

'use strict';

const nodemailer = require('nodemailer');
const ejs = require('ejs');
const fs = require('fs');



module.exports = function(Configs) {

    // create reusable transporter object using the default SMTP transport
    let transporter = nodemailer.createTransport({
        host: Configs.email.host,
        port: Configs.email.port,
        auth: {
            user: Configs.email.user,
            pass: Configs.email.pass
        }
    });

    this.sendMail = function(mailOptions) {
        mailOptions.to = Configs.mockEmail || mailOptions.to
        mailOptions.from = Configs.email.user
        return new Promise((resolve, reject) => {
            if (mailOptions.template) {
                ejs.renderFile('/../templates/' + mailOptions.template + 
                             '.ejs', mailOptions.data, null, (err, html) => {
                    if (err) {
                        return reject(err)
                    }
                    resolve(html)
                })
                return
            }
            resolve()
        }).then(html => {
            mailOptions.html = html || mailOptions.html
            return new Promise((resolve, reject) => {
                // send mail with defined transport object
                transporter.sendMail(mailOptions, (error, info) => {
                    if (error) {
                        return reject(error)
                    }
                    resolve(info)
                })
            })
        })
    }

    return this
}

Затем я хочу использовать этот модуль:

const EmailUtil = require('email')

async function foo() {
   // Do something async with await.

   const mailOptions = {...}
   EmailUtils.sendMail(mailOption);
}

Однако, это дает мне ошибку: TypeError: EmailUtils.sendMail is not a function

Примечание: я могу удалить module.export = function (Configs), но они не будут хорошими, поскольку мне нужно будет жестко указать путь к моему файлу конфигурации, и у меня будет несколько файлов конфигурации для каждой среды.Затем я хочу сохранить инъекцию зависимостей Summon.js при вызове sendMail из другого модуля.Спасибо

Есть идеи?Спасибо!

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Использование this предполагает, что функция должна использоваться в качестве конструктора.Будет необходим объект this, только если функция вызывается с new или связана с некоторым контекстом.

В JavaScript существует соглашение об использовании имен в Паскале для конструкторов, чтобы их можно было идентифицироватьоднозначно в коде.

Для заданного EmailUtil должно быть:

const EmailUtil = require('email');
const emailUtil = new EmailUtil(config);
...
emailUtil.sendMail(mailOption);
0 голосов
/ 21 февраля 2019

Я отвечаю на это, включив EmailUtils в файл depen.json, который позаботится об определении зависимостей для summonjs.Таким образом, я смог передать конфиги в EmailUtils и вызвать sendMail таким образом.

EmailUtils.sendMail(mailOptions);

Не было необходимости использовать ключевое слово new, что является отличным ответом,Я не знал, что модуль может быть создан таким образом.

0 голосов
/ 21 февраля 2019

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

const EmailUtil = require('email')

async function foo() {
   // Do something async with await.

   const mailOptions = {...}
   EmailUtil().sendMail(mailOption);
}
...