node.js - 使用 Twilio 发送数百条不同号码的短信导致发送重复消息
问题描述
我有一个大约 470 个号码的列表,其中包含我想向其发送 SMS 的不同消息。我目前使用 Firebase Cloud Functions 作为我的后端。一切似乎都在本地完美运行,无需向大约 5 个不同的测试号码发送重复的短信。
通过使用下面的代码和 470 个号码,每个号码都会收到相同的短信 3-4 次。我不知道问题是否出在 Firebase Cloud Functions 上。
这个概念是用 Twilio 发送一条短信,如果它是成功的。我使用 Firebase Firestore 将消息存储在数据库中。我试图阻止 Twilio 将重复的 SMS 发送到具有相同消息的相同号码。
来自客户端的示例代码:
textMessages[
{phoneNumber: "1111111111", message: "Test message 1 ", campaign: "Test Campaign"},
{phoneNumber: "2222222222", message: "Test message 2", campaign: "Test Campaign"},
{phoneNumber: "3333333333", message: "Test message 3", campaign: "Test Campaign"}]
exports.bulkTextWeb = functions.https.onCall(async (data) => {
const records = data.textMessages;
for (let i = 0, j = records.length; i < j; i++) {
const { phoneNumber, message, campaign } = records[i];
var msgFrom = twilio_number;
var msgTo = phoneNumber;
var msgBody = message;
await client.messages.create({
to: '1' + phoneNumber,
from: twilio_number,
body: message
})
.then(async message => {
if (message.status === 'queued' || message.status === 'sent' || message.status === 'delivered') {
// Check if campaign already exist
let docRef = await db.collection('campaigns')
.where('campaigns', 'array-contains', campaign).get()
.then(snapshot => {
// If there no campaign, add it to Firestore.
if (snapshot.empty) {
addCampaign(campaign);
}
// Add new message to Firestore
addNewMessage(msgFrom, msgTo, msgBody, campaign);
})
}
})
if (i === (j - 1)) {
// Return back to the client when all messages are sent
return { messages: 'Sent' }
}
}
})
解决方案
在我看来,问题中提供的代码量还不错,实际上它让我记得前段时间在 Node.js 应用程序中遇到了同样的问题。
问题不在于 Twilio。
您通过 Twilio发送一条消息,一次调用. client.messages.create()
由于同一条消息被多次发送,很明显它client.messages.create()
被多次调用,并且由于async/await被多次调用。
我通过摆脱async/await并使用递归来一个接一个地发送消息来解决这个问题。
您可以在我给出的答案中看到一些使用递归的代码
- 这里: twillio多个数字whatsaap
- 在这里:Twilio Functions Error 20429 - Too many requests multiple sms messages (我建议也阅读问题和菲尔的回答)。
推荐阅读
- android - 使用意图将项目数据从 Firestore UI RecyclerView 发送到下一个活动
- javascript - 如何跳过前 2 个承诺休息来解决
- php - 对于表格中的每个帖子未正确提交
- c# - 如果从文件中读取字符串,则无法将 UTF8 转码为 ASCII
- php - 理解流明语法:router->get()
- c++ - c++ boost http程序,什么是“需要缓冲区”错误?
- reactjs - 如何在redux中为同一个查询存储多个结果
- angularjs - 在同一个控制器中重复使用模板两次,但显示不同的数据
- windows - CMD 脚本在星期一复制 Fridays 文件
- istio - 安装 istioctl 1.4.0 抛出“错误:缺少图表元数据 (Chart.yaml)”