将dialogflow连接到mysql数据库以将数据插入mysql表

时间:2019-06-20 11:43:18

标签: mysql node.js dialogflow webhooks

// 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 );
})
;

这是我用来将dialogflow连接到数据库的代码。我在dialogflow中使用了内联编辑器,并对其进行了修改以将其连接到数据库。我无法连接到数据库。还有其他方法可以将dialogflow连接到数据库。

  1. 我在package.json文件中拥有所有依赖项。
  2. 我已经在MySQL中创建了一个名为test的数据库。
  3. 我已经在dialogflow中创建了一些意图,并且从这些意图中获取了默认响应。
  4. 我需要将响应中的详细信息插入数据库。

TIA,

2 个答案:

答案 0 :(得分:0)

如果我是我,我只会使用Firestore数据库。免费,而且还是Google产品! https://firebase.google.com/docs/firestore/quickstart

答案 1 :(得分:0)

您似乎正在本地计算机上运行MySQL数据库,并尝试通过主机名“ localhost”访问它。使用Dialogflow内置代码编辑器执行此操作时会遇到一些问题:

  • Dialogflow不在本地计算机上运行该实现代码。它使用Firebase Cloud Functions运行它。
  • 由于该代码未在本地计算机上运行,​​因此调用“ localhost”将调用其正在运行的计算机。由于它是一台Google机器,因此没有运行MySQL。 (当然,没有一个拥有该帐户和密码!)
  • 但是,即使您给 did 指定了可公开访问的计算机的名称,Firebase Cloud Functions仍限制访问Google云外部的计算机。您可以通过升级到付费帐户(包括免费套餐)来获得访问权限。

您可以通过几种方法解决此问题:

  • 您可以在不使用内置编辑器的情况下,在运行MySQL的同一台计算机上(或任何具有安全公共URL的计算机上)运行实现代码。
    • 如果您没有公共URL,则可以使用ngrokserveo.net之类的工具来创建到本地服务器的隧道
  • 您可以使用Google Cloud SQL服务,该服务可以是托管的MySQL实例。 (您可能仍需要为您的项目设置结算,但是可以使用一些信用额度,并且在发布操作时,您就有资格获得其他信用额度。)
  • 您可以使用Firebase Firestore之类的东西,它是一个无SQL数据库,但不适合键值存储。 (但是同样,可能需要设置帐单。)