【问题标题】:Efficiency of timeout on Firebase Cloud FunctionsFirebase Cloud Functions 的超时效率
【发布时间】:2019-03-20 02:23:11
【问题描述】:

我有一个功能,每次将新元素添加到数据库时都会发送电子邮件,如下所示:

export const onWorkCreation = functions.database.ref('/Works/{workId}').onCreate(async (snapshot, context) => {
    const work = snapshot.val();
    // const emails = ['email1@email.com', 'email2@email.com', 'email3@email.com'];
    // TODO sprawdz z jakiej kategorii zadanie, wyslij do uzytkownikow ktorzy maja te kategorie + link do deaktywacji emaili.
    let calls = [];
    const persons = admin.database().ref('Users').orderByChild('userType').equalTo('person').once('value').then(r => r.val()).catch(err => console.log(1, err));
    const companies = admin.database().ref('Users').orderByChild('userType').equalTo('company').once('value').then(r => r.val()).catch(err => console.log(2, err));
    const undefineds = admin.database().ref('Users').orderByChild('userType').equalTo('undefined').once('value').then(r => r.val()).catch(err => console.log(3, err));
    calls.push(persons, companies, undefineds);

    let users = await Promise.all(calls).catch(err => console.log(4, err));
    users = [...arrayFromObject(users[0]), ...arrayFromObject(users[1]), ...arrayFromObject(users[2])];
    users.filter(u => u.receivesNotifications === undefined || u.receivesNotifications === true);
    const usersIds = [];
    for (const i in users) {
        const user = users[i];
        if (user.testInfo[work.category] !== undefined && user.testInfo[work.category.toLowerCase()].status.toLowerCase() === 'approved' && user.receivesNotifications !== false) {
            usersIds.push(user.id);
        } else {
            // console.log(work);
            // console.log(user.testInfo[work.category]);
            // console.log(work.category);
            // console.log(2, user.testInfo[work.category] !== undefined, 3, user.testInfo[work.category] !== undefined && user.testInfo[work.category.toLowerCase()].status.toLowerCase() === 'approved', 4, user.receivesNotifications !== false)
        }
    }
    calls = [];
    for (const i in usersIds) {
        calls.push(0);
        try {
            calls[i] = await admin.auth().getUser(usersIds[i]).then(r => r).catch(err => console.log(5, err, usersIds[i]));
        } catch (e) {
            console.log('user', usersIds[i]);
        }
    }
    users = await Promise.all(calls).catch(err => console.log(6, err));
    users = arrayFromObject(users);
    console.log('users', users);
    const usersDetails = [];
    for (const i in users) {
        const user = {
            email: users[i].email,
            id: users[i].uid,
        };
        usersDetails.push(user);
    }
    calls = [];
    const mailTransport = nodemailer.createTransport({
        service: 'gmail',
        auth: {
            user: 'USER',
            pass: 'PASS'
        },
    });
    for (const i in usersDetails) {
        const user = usersDetails[i];
        calls.push(mailTransport.sendMail({
            from: `ZdajTo <noreply@zdajto.com>`,
            to: user.email,
            subject: `Dostepne sa nowe zadania!`,
            html: `<p>Hej! Sprawdz aplikacje ZdajTo! Dostepne sa nowe zadania z kategorii ${work.category}! Aby zrezygnowac z otrzymywania emaili kliknij w <a href="https://us-central1-uczsieapp.cloudfunctions.net/adminHelper/cancelEmailSubscription/${user.id}" target="_blank">ten link</a></p>`,
        }).then(() => null).catch(err => console.log(7, err, user.email)));
    }
    return Promise.all(calls).then(() => console.log('Emails sent')).catch(err => console.log(8, err));
});

它有很多代码,但简而言之,它只是为某些用户获取电子邮件并将电子邮件发送到这些地址。

现在。每次创建新的工作孩子时,我都会启动它。有没有办法检查孩子是否在数据库中挂了超过 5 分钟?

我想要达到的目标:

如果work 的属性(available)在 5 分钟内没有更改,我想再次发送电子邮件。我可以通过启动超时循环来实现它,但我希望有更好的方法来实现它。

【问题讨论】:

    标签: javascript typescript firebase google-cloud-functions


    【解决方案1】:

    为此,我将使用一个 CRON 函数,该函数根据状态和 createTime 查询工作。 (您需要在添加工作元素时填充 createTime 值。)执行 CRON 函数的最简单方法是使用 Azure Functions,但您也可以查看 GCP/firebase 的其他选项。

    【讨论】:

      猜你喜欢
      • 2018-01-03
      • 2018-04-19
      • 2017-08-26
      • 1970-01-01
      • 2019-01-14
      • 2021-08-13
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多