如何从数据库获取数据供Twilio IVR的say widget使用及问题解决
报错修复方案
针对Error: Packets out of order. Got: 45 Expected: 0的报错,按以下顺序排查修改:
- 删除代码中
db.connection.connect()这一行,Database类构造函数已经通过mysql.createConnection(config)初始化了连接,重复触发连接逻辑是该报错的高频诱因 - 检查你的MySQL服务版本,若使用8.0及以上版本,可将依赖的
mysql包替换为兼容度更高的mysql2包,旧版mysql包对MySQL 8.0的新认证协议适配存在缺陷 - 修正代码中的变量名错误:你将查询结果存入了
users变量,但后续console.log(Patients)、callback(null, Patients)两处直接使用了表名作为变量,会触发变量未定义错误,需将Patients改为users
问题1:获取Input组件用户输入并代入查询
- 在Twilio Studio的流程配置中,找到调用数据库查询Function的组件,在参数配置栏新增自定义参数,例如命名为
account_input,参数值填写{{widgets.你的Input组件ID.digits}},即可将用户输入的内容传递到Function中 - 在Function代码中通过
event.account_input即可拿到用户输入值,建议使用参数化查询避免SQL注入风险,查询语句写法参考:
const userInput = event.account_input; // 假设账号字段名为account_number,用?作为占位符,参数放在数组中传入 const users = await db.query("select * from Patients where account_number = ?", [userInput]);
问题2:提取指定字段供Say组件使用
- 先调整Function的返回值结构,返回明确的字段信息,参考写法:
try { const db = new Database(config); const userInput = event.account_input; const users = await db.query("select * from Patients where account_number = ?", [userInput]); await db.close(); // 处理查询结果,假设姓名字段为user_name if(users.length > 0) { callback(null, { findUser: true, userName: users[0].user_name }); } else { callback(null, { findUser: false, userName: "未匹配到用户" }); } } catch (e) { callback(e); }
- 在Twilio Studio的Say组件中,直接用模板语法引用返回的字段即可,示例话术写法:
{{widgets.你的Function组件ID.function.body.userName}},您有未支付账单……
内容的提问来源于stack exchange,提问作者UzZzi
相关产品推荐
相关产品推荐

