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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:18:02