是dialogflow和javascript的新手,所以我真的不熟悉如何执行dialogflow的代码这是我的if语句,用于检查用户参数是否与firebase中的值匹配,但是不起作用,并且触发了回退意图。情况是如果答案= firebase值,则漫游器会回答它是正确的,添加分数并询问下一个问题。
if( agent.parameters.pikachu == admin.database().ref('quizanswers/q1')){
agent.add(`That's correct!`);
score = score + 1;
return admin.database().ref('quizquestions').once('value').then((snapshot) =>{
const value = snapshot.child('q2').val();
agent.add(`${value}`);
});
}
if语句不起作用
对话流和检测意图
Dialogflow的目的是获取用户的短语并通过将它们与许多可能的语句进行匹配来确定其广泛的意图。例如,这使您可以创建一个Intent,其中用户可以说“是”或“确定”或“当然”或其他变体,而您的代码只需要以一种方式处理它们即可。
有时我们会在答复中回答一个短语,但是该短语中的某些值会有所不同,因此我们可以设置参数。如果这些参数可以来自一组固定的值(或这些值的同义词),则可以将其设置为Entities。 Dialogflow定义了一些实体类型,我们可以定义自己的自定义类型。如果您的问题需要多项选择答案,您甚至可以创建一个Session Entity,其中包含下一个问题的可能答案。这样,您将知道他们是否回答了您期望的事情,或者他们没有尝试。
如果您期待开放式答案,事情会变得更加困难。由于Dialogflow没有知道用户何时回复的任何模式,因此通常会以Fallback Intent结束。这是一个特殊的Intent,可匹配“所有其他不匹配的内容”,通常用于用户说完全出乎意料的情况-尽管它可用于收集自由格式的答案。
所有这一切都发生在[[之前,如果您编写的实现网络挂钩中的所有if语句都得到了评估。一旦检测到一个Intent(或还原为选择“ Fallback Intent”),它将将该Intent,检测到的所有参数以及完整的短语发送到您的Webhook。
在您的情况下,如果不了解您的Intent的设置方式,很难说清为什么要还原为Fallback Intent。但是,最可能的原因是您没有使用实体,或者没有与用户期望的短语匹配的短语。
从Firebase获取值
对于Firebase数据库,通过对数据库中的记录具有
reference来获取值,然后使用once()
来获取此记录。 (您也可以使用on()
订阅记录的更新,但这在您的情况下是不必要的。)
在if
测试中,您正在根据参考而不是
值检查用户的值。要检查该值,您可能需要在异步函数中进行更多类似的操作(未经测试):
const db = admin.database();
const q1snapshot = await db.ref('quizanswers/q1').once('value');
if( q1snapshot.val() === agent.parameters.pikachu ){
// They got it right. Fetch and ask the next question
const q2snapshot = await db.ref('quizquestions/q2').once('value');
agent.add(q2snapshot.val());
} else {
// They got it wrong. Say so.
agent.add( "That isn't correct. Please try again." );
}