Foreach l oop не завершен - PullRequest
       20

Foreach l oop не завершен

0 голосов
/ 21 апреля 2020

Я использую Node js, функции nodemailer и firebase в своем приложении.

У меня есть список писем в массиве emailConfig

const emailConfig = [
  {
    "name": "A",
    "Email": "A@gmail.com"
  },
  {
    "name": "B",
    "Email": "B@gmail.com"
  }
];

Так что мне нужно чтобы отправить электронное письмо всем в emailConfig.

Итак, я делаю это,

function sendMail() {
  emailConfig.forEach(email => {
    const mailOptions = {
      from: 'abc@gmail.com',
      to: email.Email,
      subject: 'Sending Email using Node.js',
      text: `That was easy! ${email.name}`,
      attachments: [
        {
          filename: `${email.name}_KeyMetrics.xlsx`,
          path: `${tempath}/${email.name}_KeyMetrics.xlsx`
        },
        {
          filename: `${email.name}_MandatoryCourses.xlsx`,
          path: `${tempath}/${email.name}_MandatoryCourses.xlsx`
        },
      ]
    };
    return transporter.sendMail(mailOptions, (erro, info) => {
      if (erro) {
        return res.send(erro.toString());
      }
      return res.send('Sended');
    });
  });
}

Я звоню sendMail() по запросу.

Проблема в том, что я получаю несколько писем и, наконец, ошибка в терминале Error: Function timed out.

sendMail () не заканчивается. Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 21 апреля 2020
  1. вы не можете позвонить send() после его первого вызова по одному ответу (при условии, что ваш res является сокетом Response).
  2. Array.forEach является синхронным, ваши обратные вызовы не будут быть правильно обработанным.
0 голосов
/ 21 апреля 2020

Функция в forEach is не возвращает никакого результата. Так как вы называете ключевое слово * 1002, ваш поток останавливается на этом Попробуйте удалить ключевое слово return следующим образом:

function sendMail() {
  emailConfig.forEach(email => {
    const mailOptions = {
      from: 'abc@gmail.com',
      to: email.Email,
      subject: 'Sending Email using Node.js',
      text: `That was easy! ${email.name}`,
      attachments: [
        {
          filename: `${email.name}_KeyMetrics.xlsx`,
          path: `${tempath}/${email.name}_KeyMetrics.xlsx`
        },
        {
          filename: `${email.name}_MandatoryCourses.xlsx`,
          path: `${tempath}/${email.name}_MandatoryCourses.xlsx`
        },
      ]
    };
    //remove return below
    transporter.sendMail(mailOptions, (erro, info) => {
      if (erro) {
        return res.send(erro.toString());
      }
      return res.send('Sended');
    });
  });
}

Или, если вам нужен массив результатов. Попробуйте вместо .map() прототип:

function sendMail() {
  emailConfig.map(email => { //replace forEach by map
    const mailOptions = {
      from: 'abc@gmail.com',
      to: email.Email,
      subject: 'Sending Email using Node.js',
      text: `That was easy! ${email.name}`,
      attachments: [
        {
          filename: `${email.name}_KeyMetrics.xlsx`,
          path: `${tempath}/${email.name}_KeyMetrics.xlsx`
        },
        {
          filename: `${email.name}_MandatoryCourses.xlsx`,
          path: `${tempath}/${email.name}_MandatoryCourses.xlsx`
        },
      ]
    };
    return transporter.sendMail(mailOptions, (erro, info) => {
      if (erro) {
        return res.send(erro.toString());
      }
      return res.send('Sended');
    });
  });
}
...