javascript - 错误 : function crashed out of request scope Function invocation was interrupted. 使用大列表

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

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

云功能:

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

函数调用被中断。

最佳答案

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

return Promise.all(promisesSendPushs)

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

相反,请找出在所有 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 }
})

关于javascript - 错误 : function crashed out of request scope Function invocation was interrupted. 使用大列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58666738/

相关文章:

firebase - snap.ref.remove() 正在删除父级中的所有节点,而不仅仅是其本身

android - 在应用程序更新时更新 Firebase 实例 ID

javascript - 与 Javascript 中的密码生成器苦苦挣扎。无法正确更改页面上的文本

javascript - 生成的复选框将在 jquery 中的行中找到第一个 td 的值

Firebase 3.0.1 Web API 查询不起作用,出现 iFrame 安全错误

cordova - Firebase native Cordova 插件

android - 如何更改通知徽章 Android

java - 在没有 Firebase 控制台的情况下向所有设备发送推送通知

javascript - 如何创建每个图表具有不同系列数的同步 Highcharts

javascript - 如何在不使用 for 循环的情况下使用迭代器对数组值求和