我试图异步运行一个函数。但是它会抛出错误。以下是我的代码:
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)
我尝试了多种解决方案但没有使用。这里有人能指出我犯了什么错吗?或者,如果有任何其他解决方案吗?
答案 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()来阻止。