(.).那么就不是一个函数,火力云函数



我正在尝试异步运行一个函数。但它会抛出错误。下面是我的代码:

exports.listenForNotificationRequests = functions.database.ref('/notificationRequests/{pushId}')
    .onWrite(event => {
       const requestId = event.data.val();
       var sentTo = requestId.sentTo;
       var senderIds =  sentTo.split(",");
     //  var senderTokens = "";
       var payload = {
                data: {
                  title: requestId.username,
                  message:  requestId.message,
                  sentFrom: requestId.sentFrom
                }
        };
       getSenderIds(senderIds).then(function(senderTokens){
            console.log("SenderTokens", senderTokens);
            admin.messaging().sendToDevice(senderTokens.split(","), payload)
                    .then(function(response) {
                      console.log("Successfully sent message:", response);
                    })
                    .catch(function(error) {
                      console.log("Error sending message:", error);
            });
       });
});
function getSenderIds(senderIds){
    var senderTokens = "";
    senderIds.forEach(function (snapshot){
                var ref = admin.database().ref("users/"+snapshot+"/token");
                console.log("refernce", snapshot);
                ref.once("value", function(querySnapshot2) {
                         var snapVal = querySnapshot2.val();
                         console.log("Token", snapVal);
                         senderTokens = senderTokens+","+snapVal;
                });
    });
    return senderTokens;
}

在执行时,它会抛出超越:

TypeError: getSenderIds(...).then is not a function
    at exports.listenForNotificationRequests.functions.database.ref.onWrite.event (/user_code/index.js:20:39)
    at /user_code/node_modules/firebase-functions/lib/cloud-functions.js:35:20
    at process._tickDomainCallback (internal/process/next_tick.js:129:7)

我已经尝试了多种解决方案,但没有使用。这里有人能指出我犯了什么错误吗?或者是否有其他解决方案?

要使用 then((,你的 getSenderIds(( 应该返回一个 Promise,而目前它返回一个字符串。

ref.once(( 确实返回了一个 Promise。你可以做的是使senderTokens成为一个数组,并在每次迭代时将ref.once((推送到这个数组。

因为 ref.once(( 返回一个 Promise,这使得 senderTokens 成为一个 Promise 数组,其中包含每个查询的结果。然后,您可以返回 Promise.all(senderTokens( 在此处阅读有关 Promise.all 的更多信息。

然后在 then (function(senderTokens({}( 内执行 to String 处理 通过在 senderTokens 数组的每个项目上调用 .val(( 来阻止。

你不能返回函数,你需要要么返回一个事件,要么什么都不返回。

相关内容

  • 没有找到相关文章

最新更新