подключение диалога к базе данных MySQL для вставки данных в таблицы MySQL - PullRequest
0 голосов
/ 20 июня 2019
// 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 mysql = require( 'mysql' );
const {WebhookClient} = require( 'dialogflow-fulfillment' );
const {Text, Card, Image, Suggestion, Payload} = require( 'dialogflow-fulfillment' );

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

const mysiteurl = 'https://en.wikipedia.org/wiki/Narendra_Modi';


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

  let action = request.body.result['action'];
 function welcome( agent ){
    agent.add( `Welcome to infohub personal assistant, my name is Isobel` );
    agent.add( new Card( {
        title: `mysite`,
        imageUrl: mysiteurl,
        text: `Did you know already mysite if not visit it now! `,
        buttonText: 'mysite',
        buttonUrl: mysiteurl
      } )
    );
    agent.add( `I can help you get information already contained in mysite` );
    agent.add( new Suggestion( `population` ) );
    agent.add( new Suggestion( `avgincome` ) );
    agent.add( new Suggestion( `thisyeargdp` ) );
  }


      //Call the callDBJokes method

function navigationdistance( agent ){
    // Get parameters from Dialogflow to convert
    const from = agent.parameters.from;
    const to = agent.parameters.to;
    console.log( `User requested to get info on  ${to} in ${from}` );


    if (action === 'get.data') {

        // Call the callDBJokes method
        callDB().then((output) => {
            // Return the results of the weather API to API.AI
            response.setHeader('Content-Type', 'application/json');
            response.send(JSON.stringify(output));
        }).catch((error) => {
            // If there is an error let the user know
            response.setHeader('Content-Type', 'application/json');
            response.send(JSON.stringify(error));
        });

    }


    // Sent the context to store the parameter information
    // and make sure the followup 
    agent.setContext( {
      name: 'navigationdistance',
      lifespan: 3,
      parameters: {from: from, to: to}
    } );

    // Compile and send response
    agent.add( ` ${to} in ${from} ` );

    agent.add( `Would you like to know something else?` );
    agent.add( new Suggestion( `population` ) );
    agent.add( new Suggestion( `avgincome` ) );
    agent.add( new Suggestion( `thisyeargdp` ) );
  }




  function fallback( agent ){
    agent.add( `I didnt get that, can you try again?` );
  }

  function callDB( to, from ){
    return new Promise( ( resolve, reject ) =>{

        try{

          var connection = mysql.createConnection( {
            host: "localhost",
            user: "root",
            password: "",
            database: "test"
          } );

          var sql = "INSERT INTO mocktable (from, to) VALUES ('$from', '$to')";
          connection.query( sql, function( error, results, fields ){
            if( !error ){

              let response = "The solution is: " + results[0];
              response = response.toString();
              let output = {'speech': response, 'displayText': response};
              console.log( output );
              resolve( output );

            } else{

              let output = {
                'speech': 'Error. Query Failed.',
                'displayText': 'Error. Query Failed.'
              };
              console.log( output );
              reject( output );

            }
          } );
          connection.end();

        } catch
          ( err ){
          let output = {
            'speech': 'try-cacth block error',
            'displayText': 'try-cacth block error'
          };
          console.log( output );
          reject( output );

        }

    });
  }



  let intentMap = new Map(); // Map functions to Dialogflow intent names
  intentMap.set( 'Default Welcome Intent', welcome );
  intentMap.set( 'get info about mycountry', navigationdistance );
  intentMap.set( 'Default Fallback Intent', fallback );
  agent.handleRequest( intentMap );
})
;

Это код, который я использую для подключения диалогового потока к базе данных. Я использую встроенный редактор в диалоговом потоке и изменяю его для подключения к базе данных. Я не могу подключиться к базе данных. Есть ли какой-либо другой способ подключения диалогового потока к базе данных.

  1. У меня есть все зависимости в файле package.json.
  2. Я создал базу данных с именем test в MySQL.
  3. Я создал некоторые намерения в диалоговом потоке, и я получаю ответы по умолчанию от намерений.
  4. Мне нужно вставить детали из ответа в базу данных.

ТИА

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Похоже, что вы запускаете базу данных MySQL на своем локальном компьютере и пытаетесь связаться с ней через имя хоста "localhost". При использовании встроенного редактора кода Dialogflow есть несколько проблем:

  • Dialogflow не запускает этот код выполнения на вашем локальном компьютере. Он запускается с использованием облачных функций Firebase.
  • Поскольку код не работает на вашем локальном компьютере, вызов localhost вызывает компьютер, на котором он запущен. Который, поскольку это машина Google, на нем не работает MySQL. (И уж точно не тот, у кого есть такая учетная запись и пароль!)
  • Но даже если вы дали имя машины, которая была общедоступной, у Firebase Cloud Functions есть ограничения на доступ к машинам вне облака Google. Вы можете получить доступ, перейдя на платную учетную запись (которая включает бесплатный уровень).

У вас есть несколько возможных подходов к решению этой проблемы:

  • Вместо использования встроенного редактора вы можете запускать свой код выполнения на той же машине, где работает MySQL (или на любой машине с защищенным общедоступным URL-адресом).
    • Если у вас нет общедоступного URL, вы можете использовать такой инструмент, как ngrok или serveo.net , чтобы создать туннель для локального сервера
  • Вы можете использовать Google Cloud SQL сервис, который может быть управляемым экземпляром MySQL. (Возможно, вам все равно потребуется настроить выставление счетов для вашего проекта, однако для начала доступны кредиты, и когда вы публикуете свое действие, вы имеете право на дополнительные кредиты.)
  • Вы можете перейти к чему-то вроде Firebase Firestore , который является базой данных без SQL, но более чем подходит для хранения значения ключа. (Но, опять же, может потребоваться настройка биллинга.)
0 голосов
/ 20 июня 2019

Я бы просто использовал базу данных Firestore на вашем месте.В любом случае это бесплатный продукт Google!https://firebase.google.com/docs/firestore/quickstart

...