javascript - 无法通过将文档名称保存在对话流上下文中来向文档添加多个字段

标签 javascript firebase google-cloud-firestore dialogflow-es

我创建了一个 dialogflow 机器人来询问用户一些问题,我需要保存输入到 Firestore 数据库中的所有答案,我使用的是 api v1 机器人!我可以通过在 Dialogflow 上下文中保存文档的名称来添加字段 nameanswer1

index.js:

const functions = require("firebase-functions");
const admin = require("firebase-admin");

admin.initializeApp(functions.config().firebase);

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(
  (request, response) => {
    // console.log("function happening");

    let action = request.body.result.action;

    var Name = request.body.result.parameters.Name;

    let params = request.body.result.parameters;

    var Answer1 = request.body.result.parameters.Answer1;
    var Answer2 = request.body.result.parameters.Answer2;
    var Answer3 = request.body.result.parameters.Answer3;
    var Answer4 = request.body.result.parameters.Answer4;
    var Answer5 = request.body.result.parameters.Answer5;
    var Answer6 = request.body.result.parameters.Answer6;
    var Answer7 = request.body.result.parameters.Answer7;
    var Answer8 = request.body.result.parameters.Answer8;
    var Answer9 = request.body.result.parameters.Answer9;
    var Answer10 = request.body.result.parameters.Answer10;
    var Answer11 = request.body.result.parameters.Answer11;
    var Answer12 = request.body.result.parameters.Answer12;

    let query = request.body.result.resolvedQuery;

    const parameters = request.body.result.parameters;

    const inputContexts = request.body.result.contexts;

    console.log("Parameters is" + params);
    console.log("Answer1 is " + Answer1);
    console.log("Helllo");
    console.log("action is " + action);
    console.log("name is:", Name);

    if (action == "save.name") {
      admin
        .firestore()
        .collection("users")
        .doc(Name)
        .set({
          name: Name,
          answer1: "",
          answer2: "",
        })
        .then(ref => {
          console.log("name saving function");
          console.log("Name is added successfully", +Name);
          console.log("Added new user");
        });
    }

    if (action == "save.answer1") {
      var Name;
      for (
        var co = 0;
        inputContexts && co < inputContexts.length && !Name;
        co++
      ) {
        var context = inputContexts[co];
        console.log('The input context here is ', +inputContexts[co]);
        if (context.name == "question1") {
          console.log("The name of the document is", +context.parameters.Name);
          Name = context.parameters.Name;
        }
      }
      console.log("name in save.answer1", Name);
      admin
        .firestore()
        .collection("users")
        .doc(Name)
        .update({
          answer1: Answer1
        })
        .then(ref => {
          console.log("Updated user");
          console.log("Name is " + Name);
          console.log("ref id is:" + ref.id);
        });
    }
    if (action == "save.answer2") {
      var Name;
      for (
        var co = 0;
        inputContexts && co < inputContexts.length && !Name;
        co++
      ) {
        var context = inputContexts[co];
        console.log('The input context here is ', +context.name);
        if (context.name == "question2") {
          console.log("The context name here is", +context.name);
          console.log("The name of the document is", +context.parameters.Name);
          Name = context.parameters.Name;
          console.log('Name inside if', +Name);
        }
      }
      console.log("name in save.answer2", Name);
      admin
        .firestore()
        .collection("users")
        .doc(Name)
        .update({
          answer2: Answer2
        })
        .then(ref => {
          console.log("Updated user");
          console.log("Name is " + Name);
          console.log("ref id is:" + ref.id);
        });
    }
}
);

我在 dialogflow 上下文中保存文档的名称,这样我就可以将字段 nameanswer1 保存到文档中,但我不能能够通过遵循相同的技术来保存 answer2,它会抛出如下错误:

Argument "documentPath" is not a valid ResourcePath. Path must be a non-empty string.

保存 answer1 后我在 dialogflow 中的 json 如下所示:

{
  "id": "da818283-f8bf-44ee-8c86-80a69cf8128a",
  "timestamp": "2018-07-18T07:33:51.743Z",
  "lang": "en",
  "result": {
    "source": "agent",
    "resolvedQuery": "I am fine",
    "action": "save.answer1",
    "actionIncomplete": false,
    "parameters": {
      "Answer1": "I am fine"
    },
    "contexts": [
      {
        "name": "question2",
        "parameters": {
          "Answer1": "I am fine",
          "Answer1.original": "I am fine"
        },
        "lifespan": 1
      }
    ],
    "metadata": {
      "intentId": "cf4c0b5e-b848-402a-be22-62ca26ec1d00",
      "webhookUsed": "true",
      "webhookForSlotFillingUsed": "false",
      "isFallbackIntent": "false",
      "webhookResponseTime": 10000,
      "intentName": "Q-1"
    },
    "fulfillment": {
      "speech": "Oh Well, Can you tell What is the best thing about your Companion?",
      "messages": [
        {
          "type": 0,
          "speech": "Oh Well, Can you tell What is the best thing about your Companion?"
        }
      ]
    },
    "score": 1
  },
  "status": {
    "code": 206,
    "errorType": "partial_content",
    "errorDetails": "Webhook call failed. Error: Request timeout."
  },
  "sessionId": "4967cb18-a192-0796-63ed-5ce3ec03acf9"
}

输入answer2后的json:

{
  "id": "9a9425dc-44a0-4cf6-8fa5-8d483d552c74",
  "timestamp": "2018-07-18T08:40:10.86Z",
  "lang": "en",
  "result": {
    "source": "agent",
    "resolvedQuery": "I love to watch movies",
    "action": "save.answer2",
    "actionIncomplete": false,
    "parameters": {
      "Answer2": "I love to watch movies"
    },
    "contexts": [
      {
        "name": "question3",
        "parameters": {
          "Answer2": "I love to watch movies",
          "Answer2.original": "I love to watch movies"
        },
        "lifespan": 1
      }
    ],
    "metadata": {
      "isFallbackIntent": "false",
      "webhookResponseTime": 339,
      "intentName": "Q-2",
      "intentId": "d15366cc-93f0-4178-975b-af8b0e182498",
      "webhookUsed": "true",
      "webhookForSlotFillingUsed": "false"
    },
    "fulfillment": {
      "speech": "Oh that's cool! What is the worst thing about your partner?",
      "messages": [
        {
          "type": 0,
          "speech": "Oh that's cool! What is the worst thing about your partner?"
        }
      ]
    },
    "score": 1
  },
  "status": {
    "code": 206,
    "errorType": "partial_content",
    "errorDetails": "Webhook call failed. Error: 500 Internal Server Error"
  },
  "sessionId": "4967cb18-a192-0796-63ed-5ce3ec03acf9"
}

最佳答案

问题是您没有在任何上下文中存储 name,而是试图在下一次从上下文中读取它。这些上下文是在调用您的 webhook 之间存储信息的内容,因此您需要添加下次需要的任何信息。

由于文档的名称是您需要在以后的响应中使用的内容,因此您需要保存它。

您没有显示您是如何创建或发送响应的,但请确保您创建了一个上下文并将 name 作为参数之一包含在内。

关于javascript - 无法通过将文档名称保存在对话流上下文中来向文档添加多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51396250/

相关文章:

javascript - 三元语句不起作用

javascript - 按钮-如何将一个按钮移到另一个按钮的右侧

javascript - "int"在 javascript 中是什么意思?

java - firestore -- 在 hashmap 的字段中添加元素

javascript - 覆盖插件(impress.js)中的event.keycode,而不更改插件中的代码

android - Firebase setOffline() 和读取离线数据 (android)

java - firebase facebook 登录时出现身份验证失败错误

ios - Geofire (iOS) clang : error: linker command failed with exit code 1 (use -v to see invocation)

google-cloud-firestore - 用于离线保​​存在android中的firestore回调

Android Firestore,查询数组