You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twilio Node.js函数无法转发MMS附件MediaUrl问题求助

问题分析与修复方案

你的代码无法转发MMS附件,核心问题出在媒体URL的参数传递和内部引用错误,具体问题点及修复如下:

问题1:未正确传递媒体URL参数

在转发消息的逻辑中,你调用sendSMS时传入的mediaUrl是未定义变量,正确应该传入event.MediaUrl:

// 原错误代码
console.log("Media URLs:", mediaUrl); 
const sendMessagePromises = subscribers.map(subscriber => {
  return sendSMS(subscriber.data.phone_number, incomingMessage, mediaUrl);
});

// 修复后
console.log("Media URLs:", event.MediaUrl); 
const sendMessagePromises = subscribers.map(subscriber => {
  return sendSMS(subscriber.data.phone_number, incomingMessage, event.MediaUrl);
});

问题2:sendSMS函数未使用传入的媒体URL参数

函数内部直接硬取event.MediaUrl而非传入的mediaUrl参数,导致参数传递无效;同时Twilio在单附件场景下可能返回字符串而非数组,需要统一格式:

// 原错误代码
const sendSMS = (to, body, mediaUrl) => {
    const additionalText = "Message from the Text Group! \n From: " + event.From + "\n";  
    const modifiedBody = additionalText + body;
    const mediaUrls = event.MediaUrl || []; // 直接取event,未使用传入的参数

    const messageOptions = {
        body: modifiedBody,
        from: '+18335551212',
        to: to, 
 
    if (mediaUrls.length > 0) {
    messageOptions.mediaUrl = mediaUrls || [];
   };

// 修复后
const sendSMS = (to, body, mediaUrl) => {
    const additionalText = "Message from the Text Group! \n From: " + event.From + "\n";  
    const modifiedBody = additionalText + body;
    // 统一处理媒体URL为数组格式:单字符串转数组,空值设为空数组
    const mediaUrls = Array.isArray(mediaUrl) ? mediaUrl : (mediaUrl ? [mediaUrl] : []);

    const messageOptions = {
        body: modifiedBody,
        from: '+18335551212',
        to: to, 
    };

    if (mediaUrls.length > 0) {
        messageOptions.mediaUrl = mediaUrls;
    }

修复后的完整代码

exports.handler = function(context, event, callback) {
    const twilioClient = context.getTwilioClient();
    const syncServiceSid = 'My_Sync_Service_ID_Would_Be_Here';

    const subscribe = (phoneNumber) => {
        return twilioClient.sync.services(syncServiceSid)
            .syncLists('subscribers')
            .syncListItems
            .create({ data: { phone_number: phoneNumber } });
    };

    const unsubscribe = (phoneNumber) => {
        return twilioClient.sync.services(syncServiceSid)
            .syncLists('subscribers')
            .syncListItems
            .list()
            .then(subscribers => {
                const subscriberItem = subscribers.find(item => item.data.phone_number === phoneNumber);
                if (subscriberItem) {
                    return subscriberItem.remove();
                }
            });
    };

    const sendSMS = (to, body, mediaUrl) => {
        const additionalText = "Message from the Text Group! \n From: " + event.From + "\n";  
        const modifiedBody = additionalText + body;
        // 统一处理媒体URL为数组格式
        const mediaUrls = Array.isArray(mediaUrl) ? mediaUrl : (mediaUrl ? [mediaUrl] : []);

        const messageOptions = {
            body: modifiedBody,
            from: '+18335551212',
            to: to, 
        };

        if (mediaUrls.length > 0) {
            messageOptions.mediaUrl = mediaUrls;
        }

        return twilioClient.messages.create(messageOptions);
    };

    const incomingMessage = event.Body;

    if (incomingMessage.toLowerCase() === 'join') {
        subscribe(event.From)
            .then(() => {
                callback(null, "You have successfully joined the text group! Text the word LEAVE to stop getting messages.");
            })
            .catch(error => {
                console.error("Error subscribing:", error);
                callback(error);
            });
    } else if (incomingMessage.toLowerCase() === 'leave') {
        unsubscribe(event.From)
            .then(() => {
                callback(null, "You have successfully unsubscribed from the text group. To rejoin, text JOIN to start getting messasges again. ");
            })
            .catch(error => {
                console.error("Error unsubscribing:", error);
                callback(error);
            });
    } else {
        twilioClient.sync.services(syncServiceSid)
            .syncLists('subscribers')
            .syncListItems
            .list()
            .then(subscribers => {
                const isSenderSubscribed = subscribers.some(subscriber => subscriber.data.phone_number === event.From);

                if (isSenderSubscribed) {
                    console.log("Media URLs:", event.MediaUrl);
                    const sendMessagePromises = subscribers.map(subscriber => {
                        return sendSMS(subscriber.data.phone_number, incomingMessage, event.MediaUrl);
                    });

                    Promise.all(sendMessagePromises)
                        .then(() => {
                            callback(null, "Message forwarded to subscribers");
                        })
                        .catch(error => {
                            console.error("Error sending message:", error);
                            callback(error);
                        });
                } else {
                    callback(null, "You are not subscribed. To join, please contact a member of the text group for information on how to join.");
                }
            })
            .catch(error => {
                console.error("Error retrieving subscribers:", error);
                callback(error);
            });
    }
};

关键修复说明

  1. 修正sendSMS调用时的参数传递,确保传入实际的event.MediaUrl
  2. 在sendSMS内部统一处理媒体URL格式,避免Twilio API因格式错误拒绝请求
  3. 移除函数内部对event.MediaUrl的直接引用,改用传入参数保证逻辑一致性

内容的提问来源于stack exchange,提问作者AK_Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:53:29