如何使用nodemailer为后台发送电子邮件用于NodeJS应用程序?

时间:2017-07-30 12:39:26

标签: node.js angular asynchronous cron nodemailer

我正在构建一个Angular 4和Node应用程序。一旦任何用户在前端注册,我将他们的数据存储在数据库中,然后希望使用nodemailer包向他们发送成功的注册电子邮件。

这里是Node js代码:

    router.post('/', function(req, res, next) {
       SOME_DATABASE_FUNC() {
           if(FAILED_CASE) {
              return res.status(500).json({
                  title: 'An error occurred',
                  status: 500,
                  error: error
            });

           var mailOptions {...}

           transporter.sendMail(mailOptions, function (error, info) {
              if (error) {
                 console.log(error);
                 return res.status(500).json({
                 title: 'An error occurred',
                 status: 500,
                 error: error
               });
              }
              console.log('Message', info.messageId, info.response);
              return res.status(200).json({
                 message: 'Emailed successfully',
                 details: info
              });
          });
         }
       }
    });

此代码运行良好,但发送电子邮件只需几秒钟,用户必须等待显示看起来不合适的成功响应。相反,我想在后台发送它可能是一个异步函数或者像一个cron作业。

但我不知道如何转换代码以将其作为作业发送,而不是在数据库事务之后发送和等待。请帮我解决这个问题。

3 个答案:

答案 0 :(得分:0)

使用Process.nextTick()发送电子邮件

答案 1 :(得分:0)

在transporter.sendMail块之外发送响应。所以它不会等待电子邮件发送过程完成。

transporter.sendMail(mailOptions, function (error, info) {
          if (error) {
             console.log(error);
             return res.status(500).json({
             title: 'An error occurred',
             status: 500,
             error: error
           });
          }
          console.log('Message', info.messageId, info.response);
      });
          return res.status(200).json({
             message: 'Emailed successfully',
             details: info
          });

答案 2 :(得分:0)

我们知道nodejs的请求和响应是流的,你可以在发送响应流后做一些事情,这样响应时间会减少,其他的事情在向客户端发送响应后会异步继续。

您可以成功向客户端发送响应,然后您可以调用发送邮件功能。