如何在Node.js应用程序的服务中插入传输器?

时间:2018-10-25 02:52:39

标签: javascript node.js nodemailer

我是一名新开发人员,正在为接受捐款的组织设置应用程序。

我试图将其设置为主管在收到捐赠时会收到通知的位置(理想情况下,我希望这既可以在她获得新的捐赠时又可以在她有新的捐赠人签名时进行)。

我让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 :(得分:0)

修改

当我第一次接触到这个问题时,我从根本上误解了您的最初问题。我应该澄清的是,您绝对不想在Angular代码中使用nodemailer。这仅应在您的后端(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);
      }
   );
}

希望这很清楚。 :)

P.S。我看到您可能正在使用用户名/密码进行nodemailer身份验证。根据个人经验,我强烈建议您花一些时间来学习OAuth2等,并使用刷新令牌和整个工具来进行工作。这确实值得,您将在此过程中学到很多东西。编码愉快!