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); }); } };
关键修复说明
- 修正
sendSMS调用时的参数传递,确保传入实际的event.MediaUrl - 在
sendSMS内部统一处理媒体URL格式,避免Twilio API因格式错误拒绝请求 - 移除函数内部对
event.MediaUrl的直接引用,改用传入参数保证逻辑一致性
内容的提问来源于stack exchange,提问作者AK_Dave
相关产品推荐
相关产品推荐

