Javascript 如何检查用户参数以匹配firebase中的值?
我不熟悉dialogflow和javascript,所以我对如何编写dialogflow的实现代码非常不熟悉 这是我的if语句,用于检查用户参数是否与firebase中的值匹配,但它不起作用,并且触发了回退意图。情况是, 如果答案=firebase值,则bot会回答正确,添加分数并询问下一个问题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
功能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)创建一个实体,并创建训练短语来接受以下内容:
- 我想是皮卡丘
- 皮卡丘
- 皮卡丘可能是正确的
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"
}
]
}