意图不移动到下一个意图
Intent not moving to next intent
first intent
second intent
如下代码所示,流程不是从 Number Intent 到 First Intent,而是循环到 number 循环中。在对话流中,每个意图都会产生相应的上下文。流程未根据上下文移动并卡在 NumberIntent 中。
流程应该类似于 google 向用户询问其调查 ID,用户说出其 ID 612020,然后 google 开始提问。在问题类型被评级之前,流程工作正常,即用户必须说出数字。当要求用户以描述性方式回答时会出现错误。
'use strict';
// Import the Dialogflow module from the Actions on Google client library.
const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');
// Instantiate the Dialogflow client.
const app = dialogflow({debug: true});
const axios = require('axios').default;
global.ques = [];
global.i=0;
app.intent('Default Welcome Intent', (conv) => {
conv.add('Hello! What is your survey id?');
});
app.intent('NumberIntent', (conv,{number}) => {
return axios.get('https://www.openeyessurvey.com/api/get_open_survey_info/612020')
.then((result) => {
result.data.Item.QUESTIONS.map(questionobj => {
ques.push(questionobj.question);
})
conv.ask(ques[i]);
i+=1;
}).catch( err => {
console.log("error", JSON.stringify(err,null,2));
conv.close('This is not a valid survey ID');
});
});
app.intent('FirstIntent', (conv, {number}) => {
conv.ask(ques[i]);
i+=1;
});
app.intent('SecondIntent', (conv) => {
const des = conv.parameters.any;
if(des === 'ankit'){
conv.ask(ques[i]);
i+=1;
}
});
app.intent('ThirdIntent', (conv) => {
conv.ask(ques[i]);
i+=1;
});
app.intent('FourthIntent', (conv, {number}) => {
conv.ask(ques[i]);
i+=1;
});
app.intent('FifthIntent', (conv) => {
conv.ask(ques[i]);
i+=1;
conv.close('Goodbye!')
});
// Set the DialogflowApp object to handle the HTTPS POST request.
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
Output
Output2
INVALID INTENT NAME ERROR
我怀疑问题是 i
从未真正更新过。
您将 ques
和 i
视为全局对象,但由于这是在 Firebase Cloud Functions 下的 运行,因此每次调用都可能是函数的新实例。作为一个新实例,这些将被重新初始化。
另一方面是,如果您没有获得新的实例,它还会有一个问题,即如果不止一个人同时使用该操作,这将无法正常工作,因为他们都会共享 i
.
的相同值
两者的解决方案是,不是将 i
存储为全局变量,而是将其存储在 Actions on Google 会话存储或 Dialogflow 上下文参数中。
将其存储为会话参数,您将获取值、使用它、递增它,然后再次将其保存在会话参数中。它可能看起来像这样:
const i = conv.data.i;
conv.ask(ques[i]);
conv.data.i = i+1;
first intent second intent 如下代码所示,流程不是从 Number Intent 到 First Intent,而是循环到 number 循环中。在对话流中,每个意图都会产生相应的上下文。流程未根据上下文移动并卡在 NumberIntent 中。
流程应该类似于 google 向用户询问其调查 ID,用户说出其 ID 612020,然后 google 开始提问。在问题类型被评级之前,流程工作正常,即用户必须说出数字。当要求用户以描述性方式回答时会出现错误。
'use strict';
// Import the Dialogflow module from the Actions on Google client library.
const {dialogflow} = require('actions-on-google');
const functions = require('firebase-functions');
// Instantiate the Dialogflow client.
const app = dialogflow({debug: true});
const axios = require('axios').default;
global.ques = [];
global.i=0;
app.intent('Default Welcome Intent', (conv) => {
conv.add('Hello! What is your survey id?');
});
app.intent('NumberIntent', (conv,{number}) => {
return axios.get('https://www.openeyessurvey.com/api/get_open_survey_info/612020')
.then((result) => {
result.data.Item.QUESTIONS.map(questionobj => {
ques.push(questionobj.question);
})
conv.ask(ques[i]);
i+=1;
}).catch( err => {
console.log("error", JSON.stringify(err,null,2));
conv.close('This is not a valid survey ID');
});
});
app.intent('FirstIntent', (conv, {number}) => {
conv.ask(ques[i]);
i+=1;
});
app.intent('SecondIntent', (conv) => {
const des = conv.parameters.any;
if(des === 'ankit'){
conv.ask(ques[i]);
i+=1;
}
});
app.intent('ThirdIntent', (conv) => {
conv.ask(ques[i]);
i+=1;
});
app.intent('FourthIntent', (conv, {number}) => {
conv.ask(ques[i]);
i+=1;
});
app.intent('FifthIntent', (conv) => {
conv.ask(ques[i]);
i+=1;
conv.close('Goodbye!')
});
// Set the DialogflowApp object to handle the HTTPS POST request.
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);
Output Output2
INVALID INTENT NAME ERROR
我怀疑问题是 i
从未真正更新过。
您将 ques
和 i
视为全局对象,但由于这是在 Firebase Cloud Functions 下的 运行,因此每次调用都可能是函数的新实例。作为一个新实例,这些将被重新初始化。
另一方面是,如果您没有获得新的实例,它还会有一个问题,即如果不止一个人同时使用该操作,这将无法正常工作,因为他们都会共享 i
.
两者的解决方案是,不是将 i
存储为全局变量,而是将其存储在 Actions on Google 会话存储或 Dialogflow 上下文参数中。
将其存储为会话参数,您将获取值、使用它、递增它,然后再次将其保存在会话参数中。它可能看起来像这样:
const i = conv.data.i;
conv.ask(ques[i]);
conv.data.i = i+1;