首页 > 解决方案 > 使用 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.jsfirebasegoogle-cloud-functionstwilio

解决方案


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

问题不在于 Twilio。

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

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

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


推荐阅读