Twilio Function结合Airtable实现SMS日期路由的代码问题咨询
问题修复方案
你现有代码存在4个核心错误,逐一修复后即可实现预期逻辑:
- Airtable查询语法错误:
select()方法不能直接传入JS判断表达式,必须传入符合Airtable API规范的配置对象;同时日期不能直接用JS的Date对象做全等匹配,需要格式化后对齐Airtable的日期存储格式 - TwiML初始化错误:代码中未定义大写的
Twilio对象就直接调用其下方法,会触发引用报错 - 作用域&流程错误:
forEach循环外部无法访问循环内的record变量,且循环内提前调用callback会导致函数提前终止、重复返回响应 - 匹配逻辑不严谨:仅对用户输入做了小写转换,未对Airtable存储的标准答案做相同格式处理,容易因大小写、空格问题匹配失败
修正后完整代码
const airtable = require("airtable"); const twilio = require("twilio"); const MessagingResponse = twilio.twiml.MessagingResponse; exports.handler = function (context, event, callback) { const base = new airtable({ apiKey: context.AIRTABLE_API_KEY, }).base(context.AIRTABLE_BASE_ID); const twiml = new MessagingResponse(); // 格式化当日日期为YYYY-MM-DD,按你的时区修改偏移量,东八区为8*60,UTC时区为0 const tzOffset = 8 * 60; const today = new Date(Date.now() + tzOffset * 60 * 1000); const formattedToday = today.toISOString().split('T')[0]; // 读取用户回复,统一转小写+去除首尾空格 const userAnswer = event.Body.trim().toLowerCase(); base("questions") .select({ // 用Airtable公式过滤当日的题目记录 filterByFormula: `DATETIME_FORMAT({date}, 'YYYY-MM-DD') = '${formattedToday}'`, maxRecords: 1 // 每日仅取1条匹配的题目记录 }) .all() .then((records) => { // 未查询到当日题目时返回默认提示 if (records.length === 0) { twiml.message("今日暂未配置题目,请稍后再试"); return callback(null, twiml); } const todayQuestion = records[0]; const correctAnswer = todayQuestion.get("correct").trim().toLowerCase(); // 匹配答案返回对应内容 if (userAnswer === correctAnswer) { twiml.message(todayQuestion.get("congrats")); } else { twiml.message(todayQuestion.get("hint")); } callback(null, twiml); }) .catch((error) => { callback(error); }); };
注意事项
- 提前在Twilio Function的环境变量配置页,填入正确的
AIRTABLE_API_KEY和AIRTABLE_BASE_ID - 代码中的表名
questions、字段名date/correct/congrats/hint必须和你Airtable中实际的表、字段名称完全一致,大小写敏感 - 时区偏移量
tzOffset按实际使用场景调整,否则会出现跨天查不到当日记录的问题 - 如果需要支持更宽松的答案匹配(比如允许用户输入带多余标点、近义词),可以自行修改答案比对部分的逻辑
内容的提问来源于stack exchange,提问作者D Z
相关产品推荐
相关产品推荐

