(..)。然后不是函数,firebase云功能

时间:2017-05-09 09:00:51

标签: node.js firebase firebase-cloud-messaging

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

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)

我尝试了多种解决方案但没有使用。这里有人能指出我犯了什么错吗?或者,如果有任何其他解决方案吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

因为ref.once()返回一个Promise,所以这使senderTokens成为一个Promises数组,它将包含每个查询的结果。然后,您可以返回Promise.all(senderTokens)read more about Promise.all here

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