Невозможно отправить электронную почту с помощью облачной функции firebase - PullRequest
0 голосов
/ 01 августа 2020

Невозможно отправить электронную почту после создания документа хранилища данных. Я пытаюсь отправить уведомление по электронной почте на адрес электронной почты администратора веб-приложения после создания документа в firestore. Однако возникают следующие проблемы.

index. js

const functions = require('firebase-functions');
const admin = require("firebase-admin")
const nodemailer = require('nodemailer');

admin.initializeApp()


//google account credentials used to send email
var transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        user: '*****@gmail.com',
        pass: '******'
    }
});


exports.sendEmail = functions.firestore
    .document('stories/{sId}')
    .onCreate((snap, context) => {

        const mailOptions = {
            from: `*******@gmail.com`,
            to: snap.data().email,
            subject: 'contact form message',
            html: `<h1>Order Confirmation</h1>
                                <p>
                                   <b>Email: </b>${snap.data().email}<br>
                                </p>`
        };


        return transporter.sendMail(mailOptions, (error, data) => {
            if (error) {
                return res.send(error.toString());
            }
            var data = JSON.stringify(data)
            return res.send(`Sent! ${data}`);
        });
    
    });    

журналы Firebase Functions

* sendEmail Billing account не настроено. Внешняя сеть недоступна, и квоты сильно ограничены. Настройте учетную запись биллинга, чтобы удалить эти ограничения

Функция sendEmail вернула неопределенное, ожидаемое обещание или значение *

Я предполагаю, что можно безопасно игнорировать биллинговое сообщение в журналах, так как наличие тарифный план?

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 01 августа 2020

Сообщение об ошибке сообщает вам, что ваш код вернул что-то отличное от обещания или требуемого значения. Проблема в том, как вы используете transporter.sendMail(). Согласно документации nodemailer , sendMail вернет обещание, только если вы не передадите метод обратного вызова (который вы выполняете ), в противном случае он возвращает неопределенный. Итак, ваша функция возвращает undefined.

Вместо этого вам следует удалить параметр обратного вызова и вместо этого обработать результаты из возвращенного обещания. Вы также можете вернуть обещание из функции.

    return transporter.sendMail(mailOptions)
    .then(data => {
        // decide what you want to do on success
    })
    .catch(err => {
        // decide what you want to do on failure
    });
...