Отправить два письма в одном / пост? - PullRequest
0 голосов
/ 04 апреля 2019

Моя проблема проста - иногда одно из писем не отправляется.Мой код:

api.post('/sendMail', (req, res) => {
   transporter.sendMail(someFunc(), (err) => { // send mail to one user
      if (err) {  
         res.status(500).send('error');
      }

      res.status(200).send('success');
   });

   transporter.sendMail(someFunc(), (err) => {  // send mail to second user
      if (err) {  
         res.status(500).send('error');
      }

      res.status(200).send('success');
   });
});

как указано выше - иногда одно из писем не отправляется.

Вопрос : должен ли код, отвечающий за отправку второго письма, быть внутри обратного вызова первого письма?Или это совершенно странно держать их отдельно, как в коде выше?Спасибо!

1 Ответ

3 голосов
/ 04 апреля 2019

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

Должен ли код, отвечающий за отправку второй почты, быть внутри обратного вызова первой почты?

Да, это может быть способ, однако, у него есть два недостатка

1) он плохо масштабируется (сделайте это для четырех, трех, ... десяти тысяч писем ...)

2) он не очень хорошо масштабируется с точки зрения производительности, поскольку отправляет одно электронное письмо за другим, вместо этого вы можете отправлять их параллельно:

Для этого пообещать отправку почты:

const sendMail = () => new Promise((resolve, reject) => {
  transporter.sendMail(someFunc(), (err) => { 
    if(err) reject(err) else resolve();
  });
});

Тогда это так же просто, как:

Promise.all([ sendMail(), sendMail() ])
 .then(() => res.status(200).send("success"));
 .catch(() => res.status(500).send("failure"));
...