【问题标题】:Foreach loop not getting completedForeach 循环未完成
【发布时间】:2020-08-03 21:18:03
【问题描述】:

我在我的应用程序中使用 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() 没有完成。我在这里做错了什么?

【问题讨论】:

  • 在您的代码 sn-p 中,您指的是未在其中定义的变量。提供有关res的更多详细信息

标签: javascript arrays node.js for-loop google-cloud-functions


【解决方案1】:
  1. 您不能在第一次调用单一响应后调用send()(假设您的resResponse 套接字)。
  2. Array.forEach 是同步的,你的回调将不会被正确处理。

【讨论】:

    【解决方案2】:

    forEach 中的函数不返回任何结果。因此,由于您调用 return 关键字,您的线程就停在那里。尝试像这样删除 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');
        });
      });
    }
    

    【讨论】:

      猜你喜欢
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 2021-01-19
      • 2021-04-23
      • 2021-03-18
      • 2020-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多