gpt4 book ai didi

javascript - 调用快照的 Firebase Cloud Function 'ForEach' 子函数

转载 作者:行者123 更新时间:2023-11-28 14:27:55 24 4
gpt4 key购买 nike

我正在尝试部署一个 Firebase 云功能,该功能向其关联的收件人发送 x 条短信。当对“发送”实时数据库引用进行更新时,该函数在我的 iOS 应用程序中被触发,表明用户已按下“发送”按钮。

我的 Firebase 结构是

  {
"user1uid": {
"send": false
"messagesToSend": {
"messageuid1": {
"messageText": "What's for dinner?",
"recipientNumber": "+18017378888",
}
"messageuid2:
"messageText": "Who won the Cowboys game?",
"recipientNumber": "+18017377787",
}
}
"user2uid": {
"send": false
"messagesToSend": {
"messageuid1": {
"messageText": "What's for dinner?",
"recipientNumber": "+18017378888",
}
"messageuid2:
"messageText": "Who won the Cowboys game?",
"recipientNumber": "+18017377787",
}
}
}

我的代码当前仅发送一条消息,我不确定如何正确迭代每个用户的 messagesToSend 节点并发送其中的所有消息。

我一直在尝试遵循教程 located here 。我查看了以下 Stack Overflow 回复,但无法破译或从中得出解决方案:

Firebase cloud function promises
Am I using ForEach correctly?

我发送一条消息的index.js代码如下:

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

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

const twilio = require('twilio')

const accountSid = functions.config().twilio.sid;
const authToken = functions.config().twilio.token;

const client = new twilio(accountSid, authToken);

const twilioNumber = functions.config().twilio.number;


// Start cloud function
exports.sendSecrets = functions.database
.ref('/{uid}/send')
.onUpdate((change,context) => {

const uid = context.params.uid;

return admin.database().ref(uid+'/messagesToSend').once('value').then(snapshot => {

snapshot.forEach(function(childSnapshot) {

var key = childSnapshot.key;
var messageData = childSnapshot.val();
**if (messageData.sanitized) return true;**
var message = messageData.messageText;
var phoneNumber = messageData.recipientNumber;

const textMessage = {
body: `From My App - ${message}`,
from: twilioNumber, // From Twilio number
to: phoneNumber // Text to this number
}
return client.messages.create(textMessage)
})
**return snapshot.ref.toString();**
});
});

请注意,两端标有 ** 的行表明我知道我需要根据收到的错误消息返回一些内容,表明“每个 then() 应该返回一个值或抛出”。

最佳答案

我假设您正在使用使用 Promise 的 twilio-node 库: https://www.npmjs.com/package/twilio .

由于要并行发送多条消息,因此必须使用 Promise.all(),如下所示:

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

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();

const twilio = require('twilio')

const accountSid = functions.config().twilio.sid;
const authToken = functions.config().twilio.token;

const client = new twilio(accountSid, authToken);

const twilioNumber = functions.config().twilio.number;


// Start cloud function
exports.sendSecrets = functions.database
.ref('/{uid}/send')
.onUpdate((change,context) => {

const uid = context.params.uid;

return admin.database().ref(uid+'/messagesToSend').once('value')
.then(snapshot => {

const promises = [];

snapshot.forEach(function(childSnapshot) {

var key = childSnapshot.key;
var messageData = childSnapshot.val();
//**if (messageData.sanitized) return true;**
var message = messageData.messageText;
var phoneNumber = messageData.recipientNumber;

const textMessage = {
body: `From My App - ${message}`,
from: twilioNumber, // From Twilio number
to: phoneNumber // Text to this number
}

promises.push(client.messages.create(textMessage));
})

return Promise.all(promises);
})
// Edits made below to parentheses/brackets
.then(results => {
//Do whatever you want !!
// e.g. print the results which will be an array of messages
// (see https://www.twilio.com/docs/libraries/node#testing-your-installation)
})
});

您也可以简单地返回 Promise.all(),如下所示:

....
return Promise.all(promises);
})
});

关于javascript - 调用快照的 Firebase Cloud Function 'ForEach' 子函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52525827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com