Невозможно добавить данные в FireStore, используя выполнение диалогового потока - PullRequest
1 голос
/ 27 января 2020

Я хочу отправить данные в мой пожарный магазин, используя диалоговое окно FlowFlow, но оно не работает. Вот мой индекс. js:

// See https://github.com/dialogflow/dialogflow-fulfillment-nodejs
// for Dialogflow fulfillment library docs, samples, and to report issues
'use strict';

const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const db = admin.firestore();
var product,phoneNo,eMail;;

process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements

var flag=0;


exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });

function welcome(agent) {
      if(flag==0){
        agent.add(`Can you please tell me what is your product?`);
        flag=1;
      }
      else if(flag==1){
        var prod=request.body.queryResult.queryText;
        product=prod;
        flag=2;
        agent.add(`Please provide me your Phone No or your E-Mail ID so that my team can contact you.`);
      }
      else if(flag==2||flag==3){
        let missingSlots1 = [];
        var queryRes=request.body.queryResult.queryText;

        var [phone,email] = [agent.parameters[`phone`], agent.parameters[`mail`]];

        if(queryRes.includes(`@`)&&queryRes.includes(`.`)){
          email=queryRes;
          eMail=queryRes;
          agent.parameters[`mail`]=queryRes;
        }
        else if(queryRes.length>=10&&queryRes!=product){
          console.log(`phone ke andar wala if `+queryRes);
            phone=queryRes;
            phoneNo=queryRes;
            agent.parameters[`phone`]=phoneNo;
        }

        if(!phoneNo){missingSlots1.push(`Phone No`);}
        if(!eMail){missingSlots1.push(`E-mail`);}

        if(missingSlots1.length==2){
            agent.add(`Please provide me your Phone No or your E-Mail ID so that my team can contact you.`);
        }
        else if(flag==2){
            if(!eMail){
                agent.add(`Would you please provide your E-Mail ID?`);
            }
            if(!phoneNo){
                agent.add(`Would you please provide your Phone No?`);
            }
            flag=3;
        }
        else{
            flag=4;
            addLeads();
            agent.add(`Okay.Now you are good to go!`);  
        }
      }
  }


  function addLeads(){
    var data={
        'product':product,
        'email':eMail,
        'phoneNo':phoneNo
    };

    const dialogflowAgentRef = db.collection('botData').doc(eMail);
    let setDoc = dialogflowAgentRef.set(data,{merge:true});
  }



  let intentMap = new Map();
  intentMap.set('Default Welcome Intent', welcome);
  intentMap.set('Default Fallback Intent', fallback);
  agent.handleRequest(intentMap);
});

Я удалил другие функции для простоты. Вот мой пакет. json зависимости:

"dependencies": {
    "actions-on-google": "^2.2.0",
    "firebase-functions": "^2.0.2",
    "dialogflow": "^0.6.0",
    "dialogflow-fulfillment": "^0.5.0",
    "@google-cloud/firestore": "^0.16.1",
    "firebase-admin": "^6.0.0"
  }

И вот мое разрешение на хранение:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

Основная ошибка, которую я вижу в своих журналах:

Warning, estimating Firebase Config based on GCLOUD_PROJECT. Initializing firebase-admin may fail

Если я комментирую строку let setDoc = dialogflowAgentRef.set(data,{merge:true});, моя программа работает нормально но с этой строкой программа даже не входит в эту функцию и показывает намеренный ответ, а не мой ответ на исполнение. Как мне это исправить?

1 Ответ

1 голос
/ 27 января 2020

«Ошибка», которую вы показываете, является предупреждением и обычно не мешает работе. Это говорит о том, что она предполагает среду, основанную на проекте, в котором она выполняется. Если вы обращаетесь к хранилищу данных в том же проекте - у вас не должно возникнуть никаких проблем с этим.

У вас нет не указывает на то, что происходит, когда вы пытаетесь вызвать set(), но похоже, что это может даже не происходить.

Учитывая конечный автомат, который зависит от значения глобальной переменной flag, это может быть не удивительно. Попытка отследить разговор таким образом имеет две проблемы:

  1. Похоже, что их вызывают только в желанном Намерении. Вы не показываете это определение Intent, но это может происходить только при первом вызове бота, а не после.

  2. Поскольку это глобальная переменная, а не значение, которое привязанный к разговору, он может быть изменен, если несколько пользователей пытались использовать бота одновременно или если сервер, на котором он запущен, перезагружен. Если вы используете облачные функции Firebase или встроенный редактор Dialogflow, это может произойти без вашего ведома.

В частности, (2) может привести к тому, что он никогда не доберется до состояние, в котором вызывается set().

Похоже, что с самим вызовом set() все в порядке, но вы не обрабатываете ошибки. И похоже, что вы отправляете сообщение «Вы хороши для go», прежде чем узнаете, действительно ли работает set(). Чтобы решить эту проблему, вы можете изменить addLeads(), чтобы он возвращал обещание, а затем сделать так, чтобы вызов также работал с обещанием. Это может изменить addLeads() на что-то вроде

  function addLeads(){
    var data={
        'product':product,
        'email':eMail,
        'phoneNo':phoneNo
    };

    const dialogflowAgentRef = db.collection('botData').doc(eMail);
    return dialogflowAgentRef.set(data,{merge:true});
  }

Затем, когда вы его вызываете, вам нужно как работать с Promise, так и возвращать его (поэтому Dialogflow будет ждать отправки ответа до set() завершает.) Вероятно, что-то вроде:

        return addLeads()
          .then( () => {
            agent.add(`Okay. Now you are good to go!`);  
          })
          .catch( err => {
            console.error( "There was a problem", err );
            agent.add( "There was a problem saving the data." );
          });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...