Выполнение пожарного узла - PullRequest
0 голосов
/ 12 марта 2019

Я использовал библиотеку dialogflow-выполнятьсяment-nodejs и должен хранить результаты chatbot dialogflow в базе данных firestore. Так что, когда пользователи вводят свои данные в чат-боте при оформлении заказа, они сохраняются в базе данных firestore. Вот код, который я пробовал, но он не работает:

    const admin = require('firebase-admin');
    const functions = require('firebase-functions');
    admin.initializeApp(functions.config().firebase);

    var firestore = admin.firestore();

    const { WebhookClient } = require('dialogflow-fulfillment');
    const { Carousel } = require('actions-on-google');

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

    exports.firestorehotelreservation = functions.https.onRequest((request, response) => {
console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
console.log('Dialogflow Request body: ' + JSON.stringify(request.body));

const params = request.body.queryResult.parameters
  switch (request.body.result.action) {
    case 'input.welcome':
      //let params = request.body.result.parameters;
      firestore.collection('orders').add(params)
        .then((agent) => {
          agent.add(`Welcome to my agent!`);
        })
        .catch((e => {
          console.log("error: ", e);
          response.send({
            speech: "something went wrong when writing on database"
          });
        }))
      break;
    case 'input.unknown':
      firestore.collection('orders').add(params)
        .then((agent) => {
          agent.add(`I didn't understand`);
          agent.add(`I'm sorry, can you try again?`);
          })

        .catch((e => {
          console.log("error: ", e);
          response.send({
            speech: "something went wrong when writing on database"
          });
        }))
      break;
    case 'RoomBooking':
      firestore.collection('orders').add(params)
        .then((agent) => {
          agent.add(`${params.name} your hotel booking request for ${params.RoomType}room is forwarded for 
          ${params.persons}persons. We will contact you on ${params.email} soon`);
        })
        .catch((e => {
          console.log("error: ", e);
          response.send({
            speech: "something went wrong when writing on database"
          });
        }))
      break;
    case 'complaint':
      firestore.collection('orders').add(params)
        .then((agent) => {
          agent.add(`Your ${params.typeFeedback} is duly noted against: \n Subject: ${params.subject}.
          \n Description: ${params.description}`);
        })
        .catch((e => {
          console.log("error: ", e);
          response.send({
            speech: "something went wrong when writing on database"
          });
        }))
      break;
    default:
      response.send({
        speech: "no action matched in webhook"
      })
  }
});

Chatbot работал отлично, когда я кодировал без библиотеки dialogflow-assignment-nodejs и получил ответ в chatbot dialogflow.

Ответы [ 2 ]

1 голос
/ 19 марта 2019

В случае, если кто-то ищет тот же вопрос;Вот как я исправил код.Сейчас работает.

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const { WebhookClient } = require('dialogflow-fulfillment');

process.env.DEBUG = 'dialogflow:*'; // enables lib debugging statements
admin.initializeApp(functions.config().firebase);
const db = admin.firestore();

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    const _agent = new WebhookClient({ request, response });
  //  const params = request.body.queryResult.parameters;
    console.log('Dialogflow Request headers: ' + JSON.stringify(request.headers));
    console.log('Dialogflow Request body: ' + JSON.stringify(request.body));

    function welcome(agent) {
        console.log('working');
        agent.add(`Good day! Do you want to book a room  or have some feedback for us?`);
    }

    function fallback(agent) {
        agent.add(`I'm sorry, I didn't understand. Can you say that again?`);
    }

    function roombooking(agent) {

        const firstname = agent.parameters.firstname;
        const lastname = agent.parameters.lastname;
        const persons = agent.parameters.persons;
        const email = agent.parameters.email;
        const RoomType = agent.parameters.RoomType;      
        console.log(firstname, persons, email, RoomType);
        console.log("agent parameters: ", agent.parameters);

       const dialogflowAgentRef = db.collection('data').doc();   


        return db.runTransaction(t => {
            t.set(dialogflowAgentRef, { entry: firstname, lastname, persons, email, RoomType});
            return Promise.resolve('Write complete');
        }).then(doc => {
            agent.add(`${firstname} ${lastname} your hotel booking request for ${RoomType} room is forwarded for 
      ${persons} persons. We will contact you on ${email} soon`);
        }).catch(err => {
            console.log(`Error writing to Firestore: ${err}`);
            agent.add(`Failed to write on database`);
        });

    }


     function complaint(agent) {

        const typeFeedback = agent.parameters.typeFeedback;
        const subject = agent.parameters.subject;
        const description = agent.parameters.description;


        const dialogflowAgentRef = db.collection('data').doc();   //.doc=docRef,('agent=anythin'=path)

        return db.runTransaction(t => {
            t.set(dialogflowAgentRef, { entry: typeFeedback, subject, description });
            return Promise.resolve('Write complete');
        }).then(doc => {
            agent.add(`Your ${typeFeedback} is duly noted against: \n Subject: ${subject}.
                \n Description: ${description}`);
        }).catch(err => {
            console.log(`Error writing to Firestore: ${err}`);
            agent.add(`Failed to write on database`);
        });

    }


    // Run the proper handler based on the matched Dialogflow intent
    const intentMap = new Map();
    intentMap.set('Default Welcome Intent', welcome);
    intentMap.set('Default Fallback Intent', fallback);
    intentMap.set('RoomBooking', roombooking);
    intentMap.set('Complaint', complaint);


    _agent.handleRequest(intentMap);
});
0 голосов
/ 13 марта 2019

Самая большая проблема заключается в том, что параметр agent не является объектом WebhookClient , который необходим, если вы собираетесь вызвать add() и добавить его вОтветить.Похоже, что ваш agent является результатом вызова firestore.

Как правило, каждый также настраивает функцию для каждого намерения, сопоставляет имя намерения (а не имя действия) с этой функцией и используетДиспетчер, который является частью библиотеки выполнения диалогового потока, чтобы определить, какая функция обработчика должна быть вызвана.

Не ясно, почему вы думаете, что вам нужно использовать библиотеку.Если вы обрабатываете ввод самостоятельно и отправляете вывод JSON нормально, вам не нужно использовать библиотеку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...