Как вставить транспортер в сервисы в приложении Node.js? - PullRequest
0 голосов
/ 25 октября 2018

Я новый разработчик, и я настраиваю приложение для организации, которая принимает пожертвования.

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

Я заставил часть nodemailer работать над мини-тестовым приложением, чтобы правильно его настроить.Теперь мне просто нужно вставить его в приложение в правильном месте.

Сейчас он запускается каждый раз, когда я делаю изменения (у меня есть весь код в файле index.js).Я поговорил со старшим разработчиком о nodemailer, и он упомянул одно из преимуществ: вы можете взять транспортер и вставить его туда, где он вам нужен.

Так что я думаю, что смогу сохранить большую часть кода nodemailer в файле index.js и поместить раздел транспорта туда, куда нужно.Я играл с размещением его в разных местах в файле служб, но я просто не понимаю, как это происходит.

Вот что у меня есть:

donationcontroller.js

//create donation
router.post('/createdonation', validate, function (req, res) {
    transporter.sendMail(HelperOptions, (error, info) => {
        if (error) {
          return console.log(error);
        }
        console.log("The donation was sent!");
        console.log(info);
      });
});

donationServices.js

//create donation
exports.createDonation = function(req, res){

    let newDonation = {
        used_clothing : 0,
        new_clothing : 0,
        used_shoes : 0,
        new_shoes : 0,
        baby_food: 0,
        diaper_bags: 0,
        bottles: 0,
        pacifiers: 0,
        diapers_boxes: 0,
        beds: 0,
        misc_items: 0
    }

    newDonation[req.body.donationOption] = req.body.donationAmount

    return donation.create(newDonation)
    .then(
        function createSuccess(donation) {
            res.json ({
                donation: donation
            });  
        },
        function createError(err){
            res.send(500, err.message);
        },

    );
}

Index.js

// nodemailer
// houses the data to send in the email
let transporter = nodemailer.createTransport({
    service: 'gmail',
  //   make true if using ssl certificate
    secure: false,
  //   stmp port
    port: 25,
    auth: {
      user: 'test.test@gmail.com',
      pass: 'password'
    },
  //   protocol
    tls: {
      rejectUnauthorized: false
    }
  });
  // use to construct body of email
  let HelperOptions = {
    from: '"Tester" <Test.test@gmail.com',
    to: 'test.test@gmail.com',
    subject: 'dd',
    text: 'dd'
  };
  
  // contains callback data
    transporter.sendMail(HelperOptions, (error, info) => {
      if (error) {
        return console.log(error);
      }
      console.log("The donation was sent!");
      console.log(info);
    });
    
  

1 Ответ

0 голосов
/ 25 октября 2018

Редактировать

Я принципиально неправильно понял ваш первоначальный вопрос, когда углубился в это в первый раз.Я должен был уточнить, что вы абсолютно не хотите использовать nodemailer в своем коде Angular.Это должно происходить только в вашем бэкэнде (Node.js), поскольку это единственное место, где ваши ключи API или имена пользователей / пароли будут защищены от посторонних глаз.Как только вы добавите это в приложение внешнего интерфейса, любой может взломать вашу учетную запись gmail.Так что держите триггер для своих писем в бэкэнде, и вы будете в отличной форме.Всякий раз, когда пожертвование сохраняется или что-то еще, просто как-то попадаете на свой бэкэнд-API, и тогда вы можете вызвать функцию sendEmail.:)

Исходное сообщение

Похоже, вы, вероятно, хотите поместить этот транспортер в его собственный модуль (я предполагаю, что Index.js - ваша запись верхнего уровняточка?), поэтому его легче импортировать в любой файл.Попробуйте это:

sendEmail.js

let transporter = nodemailer.createTransport({
  service: 'gmail',
  //   make true if using ssl certificate
  secure: false,
  //   stmp port
  port: 25,
  auth: {
    user: 'test.test@gmail.com',
    pass: 'password'
  },
  //   protocol
  tls: {
    rejectUnauthorized: false
  }
});

module.exports = function ({from, to, subject, text}) {
  // Promisify it, so you can easily chain it in the wild
  return new Promise(function (resolve, reject) {
    // use to construct body of email
    let HelperOptions = {
      from,
      to,
      subject,
      text
    };

    // contains callback data
    transporter.sendMail(HelperOptions, (error, info) => {
      if (error) {
        console.log(error);
        return reject(error);
      }
      console.log("The donation was sent!");
      console.log(info);
      resolve(info);
    });
  });
};

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

donationServices.js

// import the email function
const sendEmail = require('./path/to/sendEmail.js')

// create donation
exports.createDonation = function(req, res){

  let newDonation = {
    used_clothing : 0,
    new_clothing : 0,
    used_shoes : 0,
    new_shoes : 0,
    baby_food: 0,
    diaper_bags: 0,
    bottles: 0,
    pacifiers: 0,
    diapers_boxes: 0,
    beds: 0,
    misc_items: 0
  }

  newDonation[req.body.donationOption] = req.body.donationAmount

  return donation.create(newDonation)
    .then(
      function createSuccess(donation) {
        sendEmail({
          from: ‘test@gmail.com’,
          to: ‘boss@gmail.com’,
          subject: req.body.donationOption + ' donation alert'
          text: 'yay donations!\n' + JSON.stringify(donation) // you get the point...
        }).then(function (info) {
          res.json({
            donation: donation
          });
        }).catch(function (err) {
          res.status(500).send(err);
          // or maybe you don't care that the email failed:
          // res.status(200).send({message: 'donation sent, but email didn\'t'});
        }); 
      },
      function createError(err){
        res.send(500, err.message);
      }
   );
}

Надеюсь, это ясно, как грязь.:)

PS Я вижу, вы, возможно, используете имя пользователя / пароль для аутентификации узла.Исходя из личного опыта, я настоятельно рекомендую вам потратить часы, чтобы освежить в памяти OAuth2 и т. Д., И научиться работать с токенами обновления и всем шебаном.Это действительно будет стоить того, и вы узнаете тонну в процессе.Удачного кодирования!

...