Отправка по электронной почте всем пользователям, зарегистрированным в базе данных Firebase - PullRequest
0 голосов
/ 25 октября 2018

Мне нужно отправить электронное письмо всем пользователям, зарегистрированным в моей базе данных.Проблема в том, что сейчас у меня зарегистрировано 12000 пользователей.

Это мой код.Это работало для небольшого числа пользователей, но теперь работает вечно.Я также получаю эту ошибку Error: memory limit exceeded. Function invocation was interrupted., хотя я установил память на 2 ГБ.Это мой код прямо сейчас:

sendEmail.get('/:types/:message', cors(), async (req, res, next) => {
    console.log(5);
    const types = JSON.parse(req.params.types);
    console.log('types', types);
    let recipients = [];
    let mails = [];
    if (types.includes('students')) {
        console.log(1);
        const tmpUsers = arrayFromObject(await admin.database().ref('Users').orderByChild('student').equalTo(true).once('value').then(r => r.val()).catch(e => console.log(e)));
        recipients = recipients.concat(tmpUsers);
    }
    if (types.includes('solvers')) {
        console.log(2);
        let tmpUsers = arrayFromObject(await admin.database().ref('Users').orderByChild('userType').equalTo('person').once('value').then(r => r.val()).catch(e => console.log(e)));
        tmpUsers = tmpUsers.concat(arrayFromObject(await admin.database().ref('Users').orderByChild('userType').equalTo('company').once('value').then(r => r.val()).catch(e => console.log(e))));
        recipients = recipients.concat(tmpUsers);
    }
    if (types.includes('test')) {
        console.log(3);
        mails.push('mail1', 'mail2', 'mail3', 'mail4');
    }
    const calls = [];
    console.log('recipients', recipients);
    if (recipients.length > 0) {
        recipients.forEach(rec => calls.push(admin.auth().getUser(rec.id).then(r => r).catch(e => console.log(5, e))));
    }
    const newMails = await Promise.all(calls).catch(e => console.log(e));
    console.log('newMails', newMails);
    mails = mails.concat(newMails);
    console.log('mails', mails);
    res.end();
});

Некоторое объяснение.Есть 3 типа счетов.Есть студенты, люди и компании.Люди и компании должны быть отправлены по электронной почте одновременно, в то время как иногда мне нужно писать только студентам по электронной почте.Вот почему у меня это, если стек.

На данный момент я пытаюсь получить все электронные письма из БД.Как я могу сделать это более эффективным?И работоспособный?Или, что еще лучше, есть ли для этого встроенный метод Firebase?

1 Ответ

0 голосов
/ 25 октября 2018

Я бы применил нумерацию страниц с асинхронными обратными вызовами в NodeJS.Это все еще займет некоторое время, но это может быть сделано.Firebase не позволяет возвращаться при сортировке по убыванию, но вы можете сделать что-то вроде:

firebase.database().ref('books').orderByChild('ups').limitToLast(2)

Затем настройте функцию Firebase, которая выполняет разбиение на страницы и вызовите ее, или просто настройте новый эталонный объект Firebase и вызовите этос чем-то вроде Axios или Fetch API.Конечно, это можно сделать в настройках NodeJS (на стороне сервера) или на стороне клиента.Вот хороший учебник по этому вопросу:

https://howtofirebase.com/firebase-data-structures-pagination-96c16ffdb5ca

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...