Ошибка ECONNRESET при выполнении функции firebase - PullRequest
0 голосов
/ 14 ноября 2018

Я сделал некоторую функцию, чтобы отправлять уведомления по электронной почте на адрес электронной почты более 20 менеджеров каждые 5 минут, используя функцию firebase.

Я использовал запланированный запуск (для вызова функции checkNotices) с заданием cron. Это не проблема.

Когда механизм заданий cron вызывал функцию checkNotices, иногда я получал сообщения об ошибках, как показано ниже.

{ Error: read ECONNRESET
    at exports._errnoException (util.js:1020:11)
    at TLSWrap.onread (net.js:580:26)
  code: 'ECONNRESET',
  errno: 'ECONNRESET',
  syscall: 'read',
  config: 
   { adapter: [Function: httpAdapter],
     transformRequest: { '0': [Function: transformRequest] },
     transformResponse: { '0': [Function: transformResponse] },
     timeout: 0,
     xsrfCookieName: 'XSRF-TOKEN',
     xsrfHeaderName: 'X-XSRF-TOKEN',
     maxContentLength: -1,
     validateStatus: [Function: validateStatus],
     headers: 
      { Accept: 'application/json, text/plain, */*',
        'Content-Type': 'application/x-www-form-urlencoded',
        'User-Agent': 'axios/0.16.2',
        'Content-Length': 41877 },
     method: 'post',
     url: 'https://us-central1-firebase-sending-mail-t3Bd3.cloudfunctions.net/sendingMail/',
     data: 
     ...
     (something something..)
     }    

Но иногда это работает хорошо, это меня смущает.

Вот некоторая часть функции, связанной с фрагментами кода.

const axios = require('axios');
const functions = require('firebase-functions');
const admin = require('firebase-admin');

 exports.checkNotices = functions.https.onRequest((request, response) => {
    const database = admin.database();
    const date = new Date();
    // const hours = date.getHours();
    const timestamp = date.getTime();
    const oneDay = 1 * 1000 * 60 * 60 * 23;
    const timeZone = commonHelpers.getTimeZoneForNotifications();   // it returns like +2, -7, etc.
    database.ref('clubs').orderByChild('timeZone').equalTo(timeZone).once('value')
        .then((clubsData) => {
            let clubs = clubsData ? clubsData.val() : null;
            if (clubs) {
                clubs = commonHelpers.idConvertor(clubs);
                clubs = clubs.filter((club) => {
                    return (!club.doNotSendDailySummary && (!club.lastCheckDate || (timestamp > (club.lastCheckDate + oneDay))));
                });
                const processClubPromises = clubs.map((club) => {
                    return processClubPromise(club, database);
                });
                return Promise.all(processClubPromises);
            } else {
                console.log(`empty clubs for timezone ${timeZone}`);
                Promise.resolve();
            }
        })
        .then(() => {
            response.send('ok');
        })
        .catch((err) => {
            console.error('error:', err);
            response.send(err);
        });
});



function processClubPromise(club, database) {
    let liveMessages = [];
    let mgr = null;
    return database.ref(`mgrs/${club.mgrId}`).once('value')
        .then((mgrData) => {
            mgr = mgrData ? mgrData.val() : null;
            if (mgr) {
                return database.ref('messages').orderByChild('statusFilter').equalTo(`${club._id}_active`).once('value');
            } else {
                Promise.resolve();
            }
        })
        .then((liveMessagesData) => {
            liveMessages = liveMessagesData ? liveMessagesData.val() : null;
            if (liveMessages) {
                const getPausedMessagesPromises = liveMessages.map((activemessage) => {
                    const clubNotice = commonHelpers.clubNoticeConvertor(club, mgr, activemessage);
                    return processGetPausedMessages(clubNotice, club);
                });
                return Promise.all(getPausedMessagesPromises);
            } else {
                Promise.resolve();
            }
        })
        .then((listOfUnreadedmessages) => {
            if (listOfUnreadedmessages) {
                const content = emailHelpers.getclubNoticeEmailContent(listOfUnreadedmessages);
                if (content && content.contentLength > 0) {
                    const params = {
                        fromEmail: EMAIL_SENDER,
                        fromEmailName: 'Statistics email',
                        replyTo: EMAIL_SENDER,
                        toEmail: club.email,
                        subject: `Here is notification`,
                        content: content.contentText,
                    };
                    const url = `${HOST}/sendingMail/`;
                    return axios.post(url, qs.stringify(params)).catch((err) => {
                        console.error('err in axios', err, url);
                    });
                } else {
                    Promise.resolve();
                }
            } else {
                Promise.resolve();
            }
        })
        .then(() => {
            return database.ref().update({
                [`clubs/${club._id}/lastCheckDate`]: new Date().getTime(),
            });
        });
}


function processGetPausedMessages(clubEmailNotice, club) {
    const {
        userId,
        userName,
    } = clubEmailNotice;
    return new Promise((resolve, reject) => {
        return smoochAccount.appUsers.getMessages(club.appId, userId)
            .then((message) => {
                const messages = commonHelpers.parseMessages(message, userName);
                const userMessages = messages.filter((message) => {
                    return message.role === 'appUser';
                });
                const message = userMessages[userMessages.length - 1];
                if (message) {
                    resolve({notice: clubEmailNotice, message});
                } else {
                    resolve();
                }
            })
            .catch((err) => {
                reject(err);
            });
    });
}


exports.sendingMail = functions.https.onRequest((request, response) => {
    cors(request, response, () => {
        const {replyToName} = request.body;
        const fromEmail = new sendgridMailHelper.Email(request.body.fromEmail, request.body.fromEmailName);
        const replyTo = replyToName ? new sendgridMailHelper.Email(request.body.replyTo, replyToName) : new sendgridMailHelper.Email(request.body.replyTo);
        const toEmail = new sendgridMailHelper.Email(request.body.toEmail);
        const ccEmail = request.body.ccEmail;
        const subject = request.body.subject;
        const content = new sendgridMailHelper.Content('text/html', request.body.content);
        const mail = new sendgridMailHelper.Mail(fromEmail, subject, toEmail, content);
        mail.setReplyTo(replyTo);

        const sendgridRequest = sg.emptyRequest({
            method: 'POST',
            path: '/v3/mail/send',
            body: mail.toJSON(),
        });

        return sg.API(sendgridRequest).then(() => {
            response.send('ok');
        }, (err) => {
            response.send(err);
        });
    });
});

Кто-то сказал, что обещание не закрыто должным образом, однако, если это правда, почему иногда хорошо работает?

Спасибо за любой совет. Я провел так много времени с этим. Пожалуйста, спасите мою жизнь. : /

...