如何在node.js中发送邮件通知以获取响应

时间:2017-08-16 05:37:01

标签: node.js

我想以表格格式通过邮件发送回复。 在邮件选项html中,我声明res.json(streamingTemplate)==并返回以下错误:

  

Unhandled rejection Error: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11) at ServerResponse.header

就像我得到的......

var sendStreamingTemplate = function (req, res) {

authToken = req.headers.authorization;
userAuthObj = JSON.parse(UserAuthServices.userAuthTokenValidator(authToken));
var todayDate = new Date();
var expireDate = new Date(userAuthObj.expire_date);
tokenOK = TokenValidator.validateToken(userAuthObj.user_id, authToken).then(function (userSessions) {
    if (userSessions.length === 1) {
        if (expireDate >= todayDate) {
            StreamingTemplateId = req.params.id;

            TemplateController.findById(StreamingTemplateId).then(function (streamingTemplate) {
                if (streamingTemplate === null) {
                    res.status(404).json({
                        message: 'Streaming not found...'
                    })
                } else {
                    console.log(streamingTemplate);

                    let transporter = nodemailer.createTransport({
                    host: 'smtp.zoho.com',
                    port: 465,
                    auth: true,
                    active: true,
                    secure: true,
                    requireTLS: true,
                    auth: {
                        user: 'aaaaaaa@domain.com',
                        pass: 'yyyyyyyy'
                            }
                        });

                    let mailOptions = {
                    from: 'aaaaaaa@domain.com',
                    to: 'bbbbbbbbb@domain.com',
                    subject: 'mail notification Test',
                    text: 'Hello !!!!!!!!!everything works fine',
                    html:res.json(streamingTemplate)// i want to send whatever response get i will send to through mail in table format
                        };

                    transporter.sendMail(mailOptions, (error, info) => {
                    if (error) {
                         return console.log("mail not sent" +error.message);
                            }
                        console.log('success');
                        });

                    switch(streamingTemplate.template_name.toString().toLowerCase()){
                           case "stream":
                            res.json(streamingTemplate);
                            break;
                           case "broadcaster":
                            res.json(streamingTemplate);
                            break;
                           case "product":
                           res.json(streamingTemplate);
                            break;
                           default:
                           res.json(streamingTemplate);
                             break;
                       }
                }
            }).catch(function (err) {
                res.status(500).json({
                    message: 'something went wrong...'
                });
            });
        } else {
            res.status(401).json({
                message: 'Not Authorized...'
            });
        }
    } else {
        res.status(401).json({
            message: 'Token Expired...'
        });
    }
}).catch(function (err) {
    res.status(401).json({
        message: 'Token Expired...'
    });
});
};

1 个答案:

答案 0 :(得分:0)

res.json()方法是一个终端方法,它结束写入其中指定的json的响应。因此,在配置 mailOptions 时,不应使用它。

let mailOptions = {
          from: 'aaaaaaa@domain.com',
          to: 'bbbbbbbbb@domain.com',
          subject: 'mail notification Test',
          text: 'Hello !!!!!!!!!everything works fine',
          html: res.json(streamingTemplate) // Response should not be sent here
        };

相反,应将streamingTemplate传递给 mailOptions html 参数。

let mailOptions = {
          from: 'aaaaaaa@domain.com',
          to: 'bbbbbbbbb@domain.com',
          subject: 'mail notification Test',
          text: 'Hello !!!!!!!!!everything works fine',
          html: streamingTemplate // set the template here
        };