javascript - 如何检查用户参数以匹配Firebase中的值?

标签 javascript firebase firebase-realtime-database dialogflow fulfillment

我对dialogflow和javascript不熟悉,所以我真的不熟悉如何在实现dialogflow中进行编码
这是我的if语句,用于检查用户参数是否与firebase中的值匹配,但是不起作用,并且触发了回退意图。情况是
如果答案= firebase值,则漫游器会回答它是正确的,添加分数并询问下一个问题。

function q1correct(agent){  
    const q1snapshot = admin.database().ref('quizanswers/q1').once('value');
    if(q1snapshot.val() == agent.parameters.pikachu){
      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}`); 
    }); 
    }
    else{
      agent.add(`Sadly, that is incorrect.`);
      score = score;
      return admin.database().ref('quizquestions').once('value').then((snapshot) =>{
      const value = snapshot.child('q2').val();                                                            
      agent.add(`${value}`);

    });
    }
  }


if语句不起作用

如此处所示,我没有培训用语,因为如果数据库中的答案有变化,我想让它动态化,这是不可能的吗?我需要训练短语吗?
enter image description here

enter image description here

最佳答案

听起来您在这里有两个不同的问题-一个与您期望Dialogflow如何检测Intents有关,另一个与您期望Firebase如何获取值有关。

对话流和检测意图

Dialogflow的目的是获取用户的短语并通过将它们与许多可能的语句匹配来确定其广泛的Intent。例如,这使您可以创建一个Intent,其中用户可以说“是”或“确定”或“当然”或其他变体,而您的代码只需要以一种方式处理它们即可。

有时我们会在答复中用短语回答,但是该短语中的某些值会有所不同,因此我们可以设置参数。如果这些参数可以来自一组固定的值(或这些值的同义词),则可以将其设置为Entities。 Dialogflow定义了一些实体类型,并且允许我们定义自己的自定义类型。

如果您的问题需要多项选择答案,您甚至可以创建Session Entity,其中包含下一个问题的可能答案。这样,您将知道他们是否回答了您期望的结果,或者他们是否没有尝试。

如果您期待开放式答案,事情会变得更加困难。由于Dialogflow没有知道用户答复时的任何模式,因此通常会以Fallback Intent结束。这是一个特殊的Intent,它与“所有其他不匹配的内容”匹配,通常用于用户说完全出乎意料的情况-尽管它可以用来收集自由格式的答案。

所有这些都发生在对您编写的实现网络挂钩中的任何if语句进行评估之前。一旦检测到一个Intent(或还原为选择“ Fallback Intent”),它将将该Intent,检测到的所有参数以及完整的短语发送到您的Webhook。

更新资料

如您所注意到的,您根本没有为您的Intent设置任何训练短语。如果您没有任何Events(在这种情况下您可能不想使用),那么Dialogflow最终将永远不会匹配此Intent。

在这种情况下,该参数无关紧要。参数是短语中的占位符,当用户输入时,这些参数将用短语的该部分填充。

您可以创建具有输入上下文的后备意图。仅当没有其他意图匹配且输入上下文部分中列出的所有上下文当前处于活动状态时,这才会触发回退意图。这将提供用户的整个短语,您可以在此后备意图的处理程序中的比较中使用该短语。

但是,这可能不是一个好主意。不提供培训短语和实体会使对话变得更加枯燥乏味。听起来您可以为所有可能的宠物小精灵(例如@pokemon)创建一个Entity,并创建您的训练短语以接受以下内容:


我认为是皮卡丘
皮卡丘
皮卡丘可能是正确的
...


这样,Dialogflow可以将所有这些短语匹配到相同的Intent,而只需向您报告“皮卡丘”作为参数即可。

从Firebase获取价值

对于Firebase数据库,通过引用数据库中的记录来获取值,然后使用once()来获取该记录。 (您也可以使用on()订阅记录的更新,但这在您的情况下是不必要的。)

创建引用是本地操作,因此它会立即返回。但是,获取值是异步操作的,因此您需要使用Promise,该Promise仅在网络操作完成时才能解决。对于足够现代的节点版本(应使用),可以使用async / await。

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." );
}


根据您更新的代码进行更新,并说您正在使用Dialogflow内联编辑器。

内联编辑器仍(显然)仍在使用节点6,该节点不支持异步/等待。如果不使用异步/等待,则需要使用Promises(Node 6确实支持)。

所以你的台词

const q1snapshot = admin.database().ref('quizanswers/q1').once('value');
if(q1snapshot.val() == agent.parameters.pikachu){


仍然最终是不正确的,因为q1snapshot被分配了一个Promise,而且根本不是结果的快照。因此,尝试将Promise的val()与参数进行比较将不起作用。

最好的选择是升级到现代Node引擎。您将编辑package.json文件以包含“引擎”部分。它可能看起来像这样:

{
  "name": "dialogflowFirebaseFulfillment",
  "description": "This is the default fulfillment for a Dialogflow agents using Cloud Functions for Firebase",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": "8"
  },
  "scripts": {
    ...
  },
  "dependencies": {
    ...
  }
}


该显示将其设置为节点8。您可能希望考虑使用节点10,尽管该功能仍在Cloud Functions for Firebase中处于beta支持。

要在Dialogflow中使用内联编辑器进行更改,需要选择编辑器中的(package.json)选项卡:

inline editor showing package.json

关于javascript - 如何检查用户参数以匹配Firebase中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59561775/

相关文章:

javascript - 如何在参数函数(Firebase 事务)中使用 Promise?

javascript - 如何在 react-select 中合并 selectedOptions

javascript - jQuery 淡出不起作用?

firebase - 如何使用 Firebase 身份验证服务并在我们自己的数据库中拥有用户?

javascript - 我是否正确绑定(bind)了 AngularFire(Angular+FireBase)?

android - 在后台或应用程序关闭时未收到 Firebase 通知

javascript - 以原子方式递增 Firebase 实时数据库中的共享计数器

javascript - 云错误 : must supply api-key -/node_modules/cloudinary/lib/utils. js:982

javascript - 让javascript强制Selenium测试失败

java - 获取 Firebase 中的元素数量