如何使用Node.js在Dialogflow中创建同意图下生命周期为2的参数
问题解答
两种实现方案选择
两种实现路径都可以正常跑通,你可以根据自己的需求选择:
- 方案1:控制台配置参数+Node.js写逻辑:操作更简单,你可以先在Dialogflow控制台把
first、second设为必填参数,分别配置对应参数的询问话术,Dialogflow会自动按顺序触发参数询问,你只需要用Node.js编写参数校验逻辑,校验不通过时返回重新输入的提示即可,不需要自己处理会话上下文的生命周期控制。 - 方案2:全程Node.js实现:不需要在控制台做任何参数配置,所有参数收集、校验、顺序询问的逻辑都可以通过Node.js操作上下文完成。
全Node.js实现具体操作
你只需要先打开对应意图的「启用webhook调用」开关,所有逻辑都在服务端代码里控制即可,核心逻辑是每次触发webhook时先判断当前已收集的参数状态,按顺序询问未完成收集/校验不通过的参数,参考代码如下:
function test(agent) { // 获取已存储的test上下文,无上下文则取空对象 const testContext = agent.context.get('test') || { parameters: {} }; // 优先读取已收集的参数,避免初始参数覆盖已录入内容 const collectedFirst = testContext.parameters.first || agent.parameters.first; const collectedSecond = testContext.parameters.second || agent.parameters.second; // 处理第一个参数的收集与校验 if (!collectedFirst) { agent.add("请输入第一个参数的值:"); agent.context.set({ name: 'test', lifespan: 2, parameters: {} }); return; } // 此处可自定义第一个参数的校验规则,示例为校验是否为纯数字 const firstIsValid = /^\d+$/.test(collectedFirst); if (!firstIsValid) { agent.add("第一个参数仅支持输入数字,请重新输入:"); agent.context.set({ name: 'test', lifespan: 2, parameters: {} }); return; } // 处理第二个参数的收集与校验 if (!collectedSecond) { agent.add("请输入第二个参数的值:"); agent.context.set({ name: 'test', lifespan: 2, parameters: { first: collectedFirst } }); return; } // 此处可自定义第二个参数的校验规则,示例为校验长度不小于3位 const secondIsValid = collectedSecond.length >= 3; if (!secondIsValid) { agent.add("第二个参数长度不能少于3位,请重新输入:"); agent.context.set({ name: 'test', lifespan: 2, parameters: { first: collectedFirst } }); return; } // 所有参数收集校验完成,执行后续业务逻辑 agent.add(`参数收集完成:第一个参数为${collectedFirst},第二个参数为${collectedSecond}`); // 可选:清空已失效的上下文,避免影响后续会话 agent.context.set({ name: 'test', lifespan: 0 }); }
内容的提问来源于stack exchange,提问作者Mounir
相关产品推荐
相关产品推荐

