Firebase功能> 1分钟

时间:2018-04-16 17:00:52

标签: angular typescript firebase google-cloud-functions

我正在尝试设置一个小型网上商店,而firebase功能是我用来安全创建更新 firebase中付款节点的工具。

创建付款后,用户将被重定向到第三方付款服务。

通过这些两个功能,我遇到了所谓的“冷启动”#34;。

当功能很冷并且需要预热时,需要> 1min用于重定向用户并使两个功能都很好地执行。当函数预热时,一切正常,时间少于5秒,当用户被重定向到另一个网站时,我觉得这是可以接受的。

我想让它们一直保持温暖,所以这些是我考虑的选择:

  1. 使用cron-jobs(https://cron-job.org/en)每6分钟触发一次功能,使他们不会感冒。
  2. 写出更好的代码。
  3. 欢迎所有其他想法!
  4. 第一种选择是不防水的,有时会冷,有时则不防水。并编写更好的代码,以及我需要帮助的地方。这是最重要的功能:

    import * as functions from 'firebase-functions';
    import * as admin from 'firebase-admin';
    import * as request from 'request-promise-native';
    
    admin.initializeApp(functions.config().firebase);
    
    export const mollieCreatePayment = functions.database
        .ref('/orders/{orderId}')
        .onWrite(event => {
            const order = event.data.val();
            const orderId = event.params.orderId;
            const userId = order.userId;
    
            const optionsAPI = {
                method: 'POST',
                uri: 'https://api.mollie.nl/v1/payments',
                body: {
                    "amount": totalAmount,
                    "description": "Bestelling " + orderId,
                    "redirectUrl": environmentVariables.domainUrl + "/order-success/" + orderId,
                    "webhookUrl": environmentVariables.webhookUrl
                },
                headers: {
                    "Authorization": "Bearer " + environmentVariables.mollieKey
                },
                json: true // Automatically stringifies the body to JSON
            };
            request(optionsAPI)
                .then(async mollieResponse => {
                    await updateOrCreatePaymentInDb(userId, orderId, mollieResponse);
                    await updatePaymentIdInOrder(orderId, mollieResponse.id);
                    return;
                })
                .catch(function (err) {
                    console.log(err);
                });
        });
    

1 个答案:

答案 0 :(得分:2)

您没有从此函数返回一个在所有异步工作完成时完成的promise。未能从后台函数(非HTTP函数)返回承诺可能导致函数超时,因为云函数不知道工作何时完全完成。

使用promises和async / await的混合似乎对我来说是一种反模式。 IMO你应该链接承诺或使用一系列等待,而不是两者,并且绝对不会等待承诺处理程序。