【问题标题】:Sending Hundreds of SMS With Different Numbers with Twilio Caused Duplicate Messages to be Sent使用 Twilio 发送数百条不同号码的短信导致发送重复消息
【发布时间】:2019-12-07 01:19:51
【问题描述】:

我有一个包含大约 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' } 
        }
    }
})

【问题讨论】:

  • 您的问题包含很多您自己的代码......可能比帮助解决问题实际需要的代码多得多。您自己进行了哪些调试以显示问题可能出在哪里?
  • 我想提供尽可能多的代码来帮助解决我的问题。我使用 console.logs 进行调试并在本地运行了几个测试并使用 Firebase 托管。这可能是 Twilio 和 Cloud Functions 之间的滞后问题。
  • Stackoverflow 之神喜欢用尽可能短的代码来说明问题。有太多次用户陷入困境,只是将他们所拥有的一切都倾倒在问题上,期望其他人会解决这个难题:-) ....可能有助于解决这个难题的事情是记录您将要制作的内容SMS 文本(但不要)并显示在代码中的位置。此外,一些数据设计图可能会有所帮助……您的逻辑的高级“设计”是什么,而不仅仅是代码。发布代码是可以的,只要它是相关的。

标签: node.js firebase google-cloud-functions twilio


【解决方案1】:

在我看来,问题中提供的代码量还不错,事实上它让我想起了前段时间使用 Node.js 应用程序时遇到的同样问题。

问题不在于 Twilio。

您通过 Twilio 通过client.messages.create() 的一次呼叫 发送一条消息。由于多次发送相同的消息,很明显 client.messages.create() 被多次调用,并且由于 async/await 而被多次调用。

我通过摆脱 async/await 并使用递归来一个接一个地发送消息来解决问题。

你可以在我给出的答案中看到一些使用递归的代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多