【问题标题】:Error: function crashed out of request scope Function invocation was interrupted. With big list错误:函数在请求范围外崩溃 函数调用被中断。有大名单
【发布时间】:2020-02-28 04:39:32
【问题描述】:

我正在尝试执行向列表中的所有用户发送推送通知的云功能。当列表很小时,这很有效。我认为问题是由于我为发送推送而拨打的电话数量。有什么想法吗?

云功能:

exports.sendPushToUsers = functions.https.onCall((data, response) => {
    var promisesSendPushs = [];
    return admin.database().ref(Constants.USERS).once("value")
    .then((usersSnap) => {
        if(usersSnap.exists()) {
            usersSnap.forEach(userSnap => {
                if(userSnap.exists()) {
                    var user = userSnap.val();
                    if(user.firebaseToken !== undefined) {
                        var promiseSendPush;
                        if(user.platform === Constants.PLATFORM.IOS) {
                            promiseSendPush = pushs.customIOS.customized(user.firebaseToken, user.uid, data.title, data.body);
                        } else {
                            promiseSendPush = pushs.customAndroid.customized(user.firebaseToken, user.uid, data.title, data.body);
                        }
                        promisesSendPushs.push(promiseSendPush);
                    }
                }
            });
            return Promise.all(promisesSendPushs)
        } else {
            console.log("usersSnap undefined");
            return {code: 0, state: 'undefined'};
        }
    })
    .then(() => {
        console.log("promisesSendPushs: " + promisesSendPushs.length)
        return {code: 0, state: 'pushs send!'};
    })
    .catch(err => {
        console.log ('Error getting documents', err);
        return { code: 1, error: err};
    });
})

自定义推送库:

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

function sendPushToUser(firebaseToken, message, uid) {
  if(firebaseToken) {
    return admin.messaging().sendToDevice(
        [ firebaseToken ],
        message
    ).then(() => {
      return { code: 0}
    })
    .catch((err) => {
      return { code: 1}
    });
  } else {
    return { code: 1 }
  }
}

exports.customized = function(firebaseToken, uid, title, body) {
  let message = {
    data: {
      title: `${title}`,
      body: `${body}`
    }
  };
  return sendPushToUser(firebaseToken, message, uid);
};

控制台 Firebase 错误:

Error: function crashed out of request scope

函数调用被中断。

【问题讨论】:

  • 您能提供一些有关崩溃的其他信息吗?例如:通话何时开始,何时崩溃?

标签: javascript firebase firebase-cloud-messaging google-cloud-functions firebase-admin


【解决方案1】:

您可能不想将所有这些承诺的结果发送给客户端:

return Promise.all(promisesSendPushs)

Cloud Functions 可能会在尝试序列化所有已解决的 Promise 的所有结果时崩溃,这可能会变得非常大。

相反,在所有承诺都成功的情况下,找出您想要发送给客户端的响应。例如:

return Promise.all(promisesSendPushs)
.then(results => {
    return { the object to send to the client on success }
})
.catch(error => {
    return { the object to send to the client on error }
})

【讨论】:

  • 问题:Cloud Functions 在尝试序列化所有已解决的 Promise 的所有结果时崩溃,这可能会变得非常大。我在 Promise.all 之后用 try catch 解决了它,并且在发送每次推送时我没有做出任何回报,除了发送推送的那个: if(firebaseToken) { return admin.messaging().sendToDevice( [ firebaseToken ], message ).then(() => { }) .catch((err) => { }); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多