Подтверждение электронной почты Nodemailer с помощью Async / Await - PullRequest
0 голосов
/ 08 июня 2019

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

Это мой файл отправки почты, который я вызываю по другим маршрутам

//mail_file.js
//imports

sendmail= async(req)=>{
      let transporter = nodemailer.createTransport({
           //settings
      });
      var mailOptions = {
          //mailoptions
      };
      let resp=false;
      await transporter.sendMail(mailOptions, function(error, info){
          if (error) {
              console.log("error is "+error);
              resp =false;
           } 
          else {
              console.log('Email sent: ' + info.response);
              resp=true;
           }
          });
     return resp
 }

module.exports = sendmail;

Это маршрут, по которому я его называю:

//imports including the mail_file.js

//somepath.js
router.post('/somepath',(req,res,next)=>{
      sendresetmail=async()=>
            {
                parameters={
                         //some email parameters
                }
                return await sendmail(params);

            }   
       sendmail()
       .then(response=>{
            //response is always false even when the mail is sent
             })
        .catch(err=>{
           //error
             })
  })

Когда я регистрируюинформация о почте, это после регистрации ответа функции sendmail в somepath.js

1 Ответ

1 голос
/ 08 июня 2019

transporter.sendMail не возвращает обещание, он использует функцию обратного вызова. измени свой код

  return new Promise((resolve,reject)=>{
 let transporter = nodemailer.createTransport({
    //settings
 });
var mailOptions = {
   //mailoptions
};
let resp=false;

transporter.sendMail(mailOptions, function(error, info){
    if (error) {
        console.log("error is "+error);
       resolve(false); // or use rejcet(false) but then you will have to handle errors
    } 
   else {
       console.log('Email sent: ' + info.response);
       resolve(true);
    }
   });
 })  

}

Как я уже говорил ранее, функция transport.sendMail () использует функцию обратного вызова, поэтому вы не можете использовать await там. Но вы можете написать функцию-обертку вокруг нее, чтобы вы могли использовать await в своих функциях, где вам нужно больше читаемых и чистый код просто рассмотрим следующий пример

async function wrapedSendMail(mailOptions){
    return new Promise((resolve,reject)=>{
    let transporter = nodemailer.createTransport({//settings});

 transporter.sendMail(mailOptions, function(error, info){
    if (error) {
        console.log("error is "+error);
       resolve(false); // or use rejcet(false) but then you will have to handle errors
    } 
   else {
       console.log('Email sent: ' + info.response);
       resolve(true);
    }
   });
   }
   })

Теперь вы можете использовать эту функцию wrappedSendMail в других ваших функциях, как показано ниже, sendmail = async (req) => {

  var mailOptions = {
      //mailoptions
  };
  let resp= await wrapedSendMail(mailOptions);
  // lo or process resp;
   return resp;
} 
...