Javascript 如何检查用户参数以匹配firebase中的值?

Javascript 如何检查用户参数以匹配firebase中的值?,javascript,firebase,firebase-realtime-database,dialogflow-es,fulfillment,Javascript,Firebase,Firebase Realtime Database,Dialogflow Es,Fulfillment,我不熟悉dialogflow和javascript,所以我对如何编写dialogflow的实现代码非常不熟悉 这是我的if语句,用于检查用户参数是否与firebase中的值匹配,但它不起作用,并且触发了回退意图。情况是, 如果答案=firebase值,则bot会回答正确,添加分数并询问下一个问题 功能q1correct(代理){ const q1snapshot=admin.database().ref('quizanswers/q1')。once('value'); if(q1snapshot

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

功能q1correct(代理){
const q1snapshot=admin.database().ref('quizanswers/q1')。once('value');
if(q1snapshot.val()==agent.parameters.pikachu){
agent.add(`这是正确的!`);
分数=分数+1;
返回admin.database().ref('quizquestions')。一次('value')。然后((快照)=>{
const value=snapshot.child('q2').val();
add(`${value}`);
}); 
}
否则{
add(`遗憾的是,这是不正确的。`);
分数=分数;
返回admin.database().ref('quizquestions')。一次('value')。然后((快照)=>{
const value=snapshot.child('q2').val();
add(`${value}`);
});
}
}
if语句就是不起作用


如图所示,我没有训练短语,因为如果数据库中的答案发生变化,我会让它成为动态的,这是不可能的吗?我必须有训练用语吗?


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

对话框流和检测意图

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

有时,我们的响应可能会使用短语进行回复,但该短语中的某些值会有所不同,因此我们可以设置参数。如果这些参数可以来自一组固定的值(或这些值的同义词),我们可以将其设置为。Dialogflow定义了一些实体类型,我们可以定义自己的自定义类型

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

如果你期待开放式的答案,事情就会变得更加困难。由于Dialogflow在用户回复时不知道任何模式,因此它通常会以回退意图结束。这是一种特殊的意图,它匹配“其他不匹配的内容”,通常用于用户说出完全出乎意料的内容的情况,尽管它可以用于收集自由形式的答案

所有这些都发生在对您编写的fulfillment webhook中的任何if语句求值之前。一旦检测到一个意图(或者它恢复为选择回退意图),它会将此意图、检测到的任何参数和完整短语发送到您的webhook

更新

正如您所注意到的,您根本没有为您的意图设置任何培训短语。如果您没有(在这种情况下,您可能不想要),那么Dialogflow将永远不会符合此目的

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

您可以创建具有输入上下文的回退意图。只有在没有其他意图匹配且“输入上下文”部分中列出的所有上下文当前处于活动状态时,才会触发回退意图。这将从用户那里传递整个短语,您可以在处理程序中的比较中使用此短语来实现此回退意图

然而,这可能不是一个好主意。不提供培训短语和实体可能会导致更为生硬的对话。听起来你可以为所有可能的口袋妖怪(比如,@pokemon)创建一个实体,并创建训练短语来接受以下内容:

  • 我想是皮卡丘
  • 皮卡丘
  • 皮卡丘可能是正确的
通过这种方式,Dialogflow可以将所有这些短语匹配到相同的目的,但只需向您报告“Pikachu”作为参数

从Firebase获取值

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

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

if
测试中,您将根据参考而不是值检查用户的值。要对照该值进行检查,您可能需要在异步函数中执行类似操作(未测试):

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

内联编辑器仍然(显然)使用节点6,它不支持异步/等待。如果您不使用async/await,那么您需要使用Promissions(节点6支持的是Promissions)

那你的台词呢

const q1snapshot = admin.database().ref('quizanswers/q1').once('value');
if(q1snapshot.val() == agent.parameters.pikachu){
仍然是不正确的,因为
q1snapshot
被分配了一个承诺,并且根本不是结果的快照。因此,尝试将承诺的
val()
与参数进行比较是行不通的

你的
const q1snapshot = admin.database().ref('quizanswers/q1').once('value');
if(q1snapshot.val() == agent.parameters.pikachu){
{
  "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": {
    ...
  }
}
"allRequiredParamsPresent": true,
"outputContexts": [
  {
    "name": "projects/physicstutor-ydlgsm/agent/sessions/75bb149e-9803-1c15-4cfb-6689ad5e3a79/contexts/awaitans2",
    "lifespanCount": 1,
    "parameters": {
      "pikachu": "pikachu",
      "pikachu.original": "pikachu"
    }
  }
],
"intent": {
  "name": "projects/physicstutor-ydlgsm/agent/intents/f0313e22-6794-475b-ac11-279866ee5317",
  "displayName": "qStartcorrect"
},
"intentDetectionConfidence": 0.3,
"diagnosticInfo": {
  "webhook_latency_ms": 128
},
"languageCode": "en"
"webhookStatus": {
"code": 14,
"message": "Webhook call failed. Error: UNAVAILABLE."
},
"alternativeQueryResults": [
{
  "queryText": "pikachu",
  "outputContexts": [
    {
      "name": "projects/physicstutor-ydlgsm/agent/sessions/75bb149e-9803-1c15-4cfb-6689ad5e3a79/contexts/awaitans1",
      "parameters": {
        "quiz.original": [
          "quiz"
        ],
        "quiz": [
          "quiz"
        ]
      }
    }
  ],
  "languageCode": "en"
}
]
}