使用Twilio Messaging Services向数据库成员群发消息的问题咨询
问题排查与修复方案
核心问题列表
- 变量作用域与返回值错误:你定义的
FetchDB、ReturnNumberOfContacts、SuccessResponse等函数都没有显式返回值,而是直接修改未声明的全局变量,外部定义的变量无法被正确赋值,还会引发全局变量污染。 - 异步流程逻辑错误:
await和then混用时你直接执行了回调函数(比如then(ReturnNumberOfContacts(allItems))相当于立即执行ReturnNumberOfContacts再把返回值传给then,而非等待前面的异步执行完成再调用),导致数据还没返回就提前执行后续逻辑。 - 批量短信发送无等待:
SendMessages函数中用forEach调用异步的短信发送接口,既没有加await也没有收集所有Promise等待执行完成,函数会直接返回,不等短信发送完成就触发后续的成功响应。同时你调用SendMessages时参数传递顺序完全错误,函数内部用到的client、messaging_service也没有传入,会抛出未定义错误。 - 回调调用时机混乱:部分分支调用
callback后没有终止函数执行,可能会触发重复调用callback的报错。
修正后完整代码
// 引入依赖 const { Deta } = require("deta"); const twilio = require('twilio'); // 从数据库拉取所有联系人 async function FetchDB(db) { let res = await db.fetch(); let allItems = res.items; // 分页拉取所有数据 while (res.last){ res = await db.fetch({}, {last: res.last}); allItems = allItems.concat(res.items); } return allItems; } // 批量发送短信 async function SendMessages(allItems, message, client, messaging_service) { // 收集所有发送任务的Promise const sendTasks = allItems.map(contact => { return client.messages.create({ body: `Hey ${contact.name}! ${message}`, messagingServiceSid: messaging_service, to: contact.key }) }) // 等待所有短信发送完成 await Promise.all(sendTasks); } // 生成成功响应 function SuccessResponse(user_name, number_of_contacts) { return { "actions": [ { "say": `${user_name}, your broadcast has successfully sent to ${number_of_contacts} contacts.` }, { "listen": true } ] } } // 主函数 exports.handler = async function(context, event, callback) { try { // 初始化实例 const client = twilio(context.ACCOUNT_SID, context.AUTH_TOKEN); const deta = Deta(context.DETA_PROJECT_KEY); const db = deta.Base("users2"); const messaging_service = context.MESSAGING_SERVICE; const from = event.UserIdentifier; const memory = JSON.parse(event.Memory); // 拉取所有联系人 const allItems = await FetchDB(db); const number_of_contacts = allItems.length; // 提取发送内容 let message; if (memory.triggered) { message = memory.message; } else { message = memory.twilio.collected_data.broadcast_message.answers.message_input.answer; } // 校验用户身份 const current_user = await db.get(from); let user_name = current_user?.name || "friend"; // 非授权用户直接返回 if (from !== context.BROADCAST_NUMBER) { return callback(null, { "actions": [ { "say": "You are not authorized to broadcast." }, { "listen": false } ] }) } // 取消发送逻辑 if (message.toLowerCase() === "c" || message.toLowerCase() === "cancel") { const responseObject = { "actions": [ { "say": `${user_name}, you have canceled your request and no messages have been sent.` }, { "listen": false } ] } return callback(null, responseObject); } // 执行批量发送 await SendMessages(allItems, message, client, messaging_service); const responseObject = SuccessResponse(user_name, number_of_contacts); return callback(null, responseObject); } catch (err) { // 错误捕获,避免函数无响应 console.error(err); return callback(err); } };
内容的提问来源于stack exchange,提问作者Develop With Data
相关产品推荐
相关产品推荐

