Отправка соответствующего ответа Swagger из NodeMailer - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь отправить электронное письмо с помощью вызова API (Swagger) из пакета NodeMailer (версия 2.7.2).С функциональной точки зрения все в основном работает нормально, то есть электронная почта доставляется как положено.

Единственное, я не получаю ответ, который работает для контроллера Swagger, который вызывает пакет nodemailerКоманда sendEmail.

Вот код для функции nodeMailer.Это работает (отправляет электронное письмо) и выводит следующие на консоль :

Попытка отправить почту: ["someemail@gmail.com"]250 2.0.0 OK 1550718405 w10sm28574425pge.8 - gsmtp

'use strict';
const fs = require('fs');
var nodemailer = require('nodemailer');
var emailConfig = require('../configs/email.json');

/**
 * @since AlphaRC7
 * @desc Config is loaded for nodemailer via emailConfig.json,
 * for more information: see https://nodemailer.com/smtp/
 * @param emails is a comma separated string sent from the controller processing things before hand
 * 
 * @since AlphaRC8
 * @param shareUrl is a string GUID
 */

exports.sendEmail = function (shareUrl, emails, pdfContent) {
    return new Promise(function (req, resolve) {
        var transporter = nodemailer.createTransport(emailConfig);
        console.log(pdfContent.buffer);
        // setup e-mail data with unicode symbols
        var mailOptions = {
            from: emailConfig.fromSenderEmail, // sender email address
            to: emails, // list of receivers
            subject: 'Your colleague shared a report with you!',
            text: 'Hey there! Your colleague wants to collaborate with you! <br />' +
                    'Check here to visit: ' + shareUrl, // plaintext body'
            html: 'Hey there! Your colleague wants to collaborate with you! <p>' +
                    '<b>Click here to visit: </b> <a href=' + shareUrl + '>' + shareUrl + '</a></p>',
            attachments:[{
                filename: 'report.pdf',
                content:  new Buffer(pdfContent.buffer, 'binary')
            }]
        };

        console.log("Attempting to send mail to:");
        console.log(emails);
        return transporter.sendMail(mailOptions).then(function(info) {
            console.log(info.response);
        }).catch(function(err) {
            console.log(err);
        });
    });
}

Однако Swagger никогда не получает ответ в info.response от обратного вызова sendMails.Вот контроллер Swagger, который вызывает функцию sendEmail:

'use strict';

var utils = require('../utils/writer.js');
var email = require('../impl/EmailService.js');
var fs = require('fs');

/**
 * This function simply instantiates the entry, so we don't need to pass
 * it anything, just have an agreement on the security side.
 */
module.exports.sendEmail = function sendEmail (req, res, next) {
    
    var shareUrl = req.swagger.params.shareUrl.value;
    var emails = req.swagger.params.emails.value;
    var pdfBlob = req.swagger.params.myblob.value;


    email.sendEmail(shareUrl, emails, pdfBlob)
        .then(function (response) {
            console.log(response);
            res.send(response);
            utils.writeJson(res, response);
        })
        .catch(function (response) {
            console.log(response);
            res.send(response);
            utils.writeJson(res, response);
        });
};

Функция ".then" от контроллера никогда не достигается, поэтому Swagger просто останавливается и никогда не получает ответ (просто застревает при загрузке):

enter image description here

Пожалуйста, дайте мне знать, что мне нужно сделать, чтобы правильно вернуть результат обратного вызова NodeMailer в функцию, вызываемую из контроллера Swagger.Я попытался вернуть реальную функцию sendMail, а также функцию response.info, и ни один из них не вызывает код в функции .then () контроллера Swagger.

1 Ответ

0 голосов
/ 24 февраля 2019

Я смог решить свой вопрос здесь.Оказывается, что nodemailer уже возвращает обещание, поэтому возвращение обещания обещало (разумно) не действовать так, как я думал обещание.Удалив ошибочный / возвращенный код «новый Promise», я смог получить соответствующий ответ обратно в файл контроллера, вернув встроенную функцию Promise для nodeMailer.

...