Dialogflow中如何获取前序意图参数实现出生日期校验
Dialogflow跨字段出生日期校验实现方案
1. 核心问题答疑
- 必须使用Dialogflow的**上下文(Contexts)**实现跨意图传值,不需要额外配置followup intents,上下文是Dialogflow跨会话步骤存储临时数据的标准实现
- 处理出生日期天数的独立js文件可以通过读取上下文存储的参数,拿到用户之前输入的月份值
2. 完整实现步骤
第一步:Dialogflow端上下文配置
在采集出生月份的意图配置页,找到Output contexts配置项,新增自定义上下文,命名为dob-collection,有效期设置为5(保证后续采集日、年的意图都能读取到该上下文即可)。
同时在采集出生日期天数的意图配置页,找到Input contexts配置项,填入dob-collection,保证只有采集完月份后该意图才会被触发,避免用户跳步访问。
第二步:出生月份意图存储参数示例(对应你处理月份的intent.js)
假设你用官方dialogflow-fulfillment库处理webhook请求,代码参考如下:
// 处理出生月份的intent.js module.exports = (agent) => { const inputMonth = agent.parameters.dobmonth; // 你已实现的月份校验逻辑 const parsedMonth = parseInt(inputMonth); const isValidMonth = parsedMonth >= 1 && parsedMonth <= 12; if (!isValidMonth) { agent.add('请输入1-12范围内的有效月份'); return; } // 校验通过后将合法月份存入上下文 agent.context.set({ name: 'dob-collection', lifespan: 5, parameters: { confirmedMonth: parsedMonth } }); agent.add('请输入您的出生日期天数?'); }
第三步:出生日期天数意图校验逻辑示例(对应你处理天数的intent.js)
// 处理出生日期天数的intent.js module.exports = (agent) => { const inputDay = parseInt(agent.parameters.dobday); // 从上下文中读取之前存储的用户输入月份 const dobContext = agent.context.get('dob-collection'); const confirmedMonth = dobContext.parameters.confirmedMonth; // 各月最大天数字典,2月后续可结合采集到的年份补充闰年判断逻辑 const monthMaxDays = { 1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31 }; const maxValidDay = monthMaxDays[confirmedMonth]; // 天数校验 if (inputDay < 1 || inputDay > maxValidDay) { agent.add('抱歉,这是无效的出生日期,请重新输入天数'); // 重置上下文有效期避免过期 agent.context.set({ name: 'dob-collection', lifespan: 5, parameters: { confirmedMonth } }); return; } // 校验通过后可把天数也存入上下文,后续年份校验/最终组装数据时可直接读取 dobContext.parameters.confirmedDay = inputDay; agent.context.set(dobContext); agent.add('请输入您的出生年份?'); }
3. 未使用官方库的适配方案
如果你直接解析原生webhook请求体,可从req.body.queryResult.outputContexts数组中找到名称为dob-collection的对象,直接读取其parameters.confirmedMonth字段即可拿到之前存储的月份值。
内容的提问来源于stack exchange,提问作者lakshmi
相关产品推荐
相关产品推荐

