Как подключить выполнение Dialogflow к базе данных MySQL?

#javascript #mysql #dialogflow-es

#javascript #mysql #dialogflow-es

Вопрос:

Я попытался подключить мой агент Dialogflow к базе данных MySQL в моем GCP, но это не сработало должным образом. Я просто хочу увидеть результаты в консоли, но по этому поводу результатов нет. Я вижу только результат «Undefined», но поскольку я не знаком с Node.js Я не уверен, что это значит. Поскольку в результате нет содержимого, я не могу перейти к следующему шагу.

Вот мой index.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 mysql = require('mysql');
 
process.env.DEBUG = 'dialogflow:debug'; // enables lib debugging statements
 
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));
 
  function welcome(agent) {
    agent.add(`Welcome to my agent!`);
  }
 
  function fallback(agent) {
    agent.add(`I didn't understand`);
    agent.add(`I'm sorry, can you try again?`);
  }

  function connectToDatabase() {
    const connection = mysql.createConnection({
      host: '34.64.***.***',
      user: 'username',
      password: 'password',
      database: 'dbname'
    });
    return new Promise((resolve,reject) => {
       connection.connect();
       console.log('connection successed.');
       resolve(connection);
    });
  }
  
  function queryDatabase(connection, name){
    return new Promise((resolve, reject) => {
      connection.query('SELECT * FROM tb_user WHERE name = ?', name, (error, results, fields) => {
        console.log('query successed.');
        resolve(results);
      });
    });
  }
  
  function queryDatabase2(connection){
    return new Promise((resolve, reject) => {
      connection.query('SELECT * FROM tb_user', (error, results, fields) => {
        if (error) console.log(error);
        console.log('results', results);
      });
    });
  }
  
  function handleReadFromMysql(agent) {
    const user_name = agent.parameters.name;
    console.log(user_name.name);
    return connectToDatabase()
    .then(connection => {
      console.log('connectToDatabase passed');
      return queryDatabase(connection, user_name.name)
      //return queryDatabase2(connection)
      .then(result => {
        console.log('queryDatabase passed');
        console.log(result);
        agent.add(`User name is ${user_name} .`);
        //result.map(user => {
          //if(user_name === user.name) {
            //agent.add(`UserID is  ${user.id}`);
          //}
        //});
        connection.end();
      });
    });
  }
  
  let intentMap = new Map();
  intentMap.set('Default Welcome Intent', welcome);
  intentMap.set('Default Fallback Intent', fallback);
  intentMap.set('findName', handleReadFromMysql);
  agent.handleRequest(intentMap);
});  

и журналы являются :

введите описание изображения здесь

Пожалуйста, кто-нибудь, помогите мне…

Комментарии:

1. Эй, первым делом handleReadFromMysql не должен возвращать обещание, он просто должен использовать объект agent для возврата ответа Dialogflow, как вы делали для целей приветствия.

Ответ №1:

Я решил эту проблему 4 месяца назад, поэтому я делюсь своим кодом, чтобы помочь другому такому же, как я.

Я использую socketPath информации о базе данных. Я забыл причину.

 function connectToDatabase() {
    const connection = mysql.createConnection({
        socketPath: '/cloudsql/*************:asia-northeast3:****',
        user: '****',
        password: '****',
        database: '****'
    });
    return new Promise((resolve, reject) => {
        connection.connect();
        console.log('connection successed.');
        resolve(connection);
    });
}
  

И сделайте функцию запроса типа :

 function findNameCountQuery(connection, name) {
return new Promise((resolve, reject) => {
    var sql = `SELECT * FROM tb_user WHERE name = ?`;
    var execSql = connection.query(sql, [name], (error, results) => {
        if (error) throw error;
        resolve(results);
    });
});
  

Затем я использую функцию агента, такую как :

 async function findName(agent) {
    const user_name = agent.parameters.person.name;
    const connection = await connectToDatabase();
    const result = await findNameQuery(connection, user_name);
    result.map(user => {
        message  = `사용자 ID seq number : ${user.seq}n`;
    });

    agent.add(message);
    connection.end();
}
  

Надеюсь быть полезным.