Соедините DialogflowChatbot с базой данных PostgreSQL - PullRequest
0 голосов
/ 06 декабря 2018

Я бы хотел подключить пользовательского чата в Dialogflow с базой данных PostgreSQL.Сценарий состоит в том, что пользователь отправляет свои запросы боту и, в свою очередь, передает запросы SQL в базу данных.Я знаю, что следует использовать Webhook / Fulfillment и Integration, но вопрос в том, как .

До сих пор я пытался кодировать в Fulfillment / Inside Editor, помещая ...

const pg = require('pg');
const connectionString = process.env.DATABASE_URL || 'postgres://un:pass@localhost:5432/postgres';
const client = new pg.Client(connectionString);
client.connect();
const query = client.query('CREATE TABLE items(id SERIAL PRIMARY KEY, text VARCHAR(40) not null, complete BOOLEAN)');
    query.on('end', () => { client.end(); });

... в index.js.Кроме того, когда я пытаюсь использовать Google Assistant, я всегда получаю сообщение об ошибке Webhook без каких-либо показательных объяснений:

textPayload: "MalformedResponse: Webhook error (206)"  

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

У кого-нибудь есть совет для меня?Спасибо!

Ниже приводится выдержка из журнала:

7:10:03.013 PM
dialogflowFirebaseFulfillment
Ignoring exception from a finished function
7:10:02.995 PM
dialogflowFirebaseFulfillment
Function execution took 10 ms, finished with status code: 200
7:10:02.986 PM
dialogflowFirebaseFulfillment
Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictions
7:10:02.986 PM
dialogflowFirebaseFulfillment
Function execution started
7:09:49.540 PM
dialogflowFirebaseFulfillment
Ignoring exception from a finished function
7:09:48.543 PM
dialogflowFirebaseFulfillment
Function execution took 865 ms, finished with status code: 200
7:09:47.678 PM
dialogflowFirebaseFulfillment
Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictions
7:09:47.678 PM
dialogflowFirebaseFulfillment
Function execution started
7:09:12.659 PM
dialogflowFirebaseFulfillment
Warning, estimating Firebase Config based on GCLOUD_PROJECT. Initializing firebase-admin may fail
7:08:41.442 PM
dialogflowFirebaseFulfillment
Warning, estimating Firebase Config based on GCLOUD_PROJECT. Initializing firebase-admin may fail
7:04:51.279 PM
dialogflowFirebaseFulfillment
Ignoring exception from a finished function
7:04:51.238 PM
dialogflowFirebaseFulfillment
Function execution took 896 ms, finished with status code: 200
7:04:50.343 PM
dialogflowFirebaseFulfillment
Billing account not configured. External network is not accessible and quotas are severely limited. Configure billing account to remove these restrictions
7:04:50.343 PM
dialogflowFirebaseFulfillment
Function execution started
7:04:33.195 PM
dialogflowFirebaseFulfillment
Warning, estimating Firebase Config based on GCLOUD_PROJECT. Initializing firebase-admin may fail

1 Ответ

0 голосов
/ 07 декабря 2018

Я недавно писал о подключении MongoDB с Dialogflow здесь .

Как я уже говорил ранее, вы не сможете подключиться к локальному экземпляру вашего Postgres, работающему на localhost: 5432(ни MySQL на localhost: 8080).Вы должны использовать размещенный Postgres сервис, такой как ElephantSQL (для других баз данных, кроме Firebase / Firestore.)

Теперь для перехода к вашему ответу, прежде всего, важно серьезно отнестись к этому сообщению:

Платежная учетная запись не настроена.Внешняя сеть недоступна, и квоты строго ограничены.Настройте платежную учетную запись, чтобы снять эти ограничения

. Для решения этой проблемы чрезвычайно важно вы используете платежную учетную запись, например Blaze Plan of firebase для доступа к внешним сетям (которыебазы данных, размещенные в качестве службы в вашем случае) См. этот .

код

'use strict';

const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');

const pg = require('pg');
const connectionString = process.env.DATABASE_URL || 'postgres://fsdgubow:K4R2HEcfFeYHPY1iLYvwums3oWezZFJy@stampy.db.elephantsql.com:5432/fsdgubow';
const client = new pg.Client(connectionString);
client.connect();
//const query = client.query('CREATE TABLE items(id SERIAL PRIMARY KEY, text VARCHAR(40) not null, complete BOOLEAN)');

});

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) {

     const text = 'INSERT INTO items(text, complete) VALUES($1, $2) RETURNING *'
     const values = ['some item text', '1' ]

    // insert demo in your items database
    client.query(text, values)
      .then(res => {
        console.log(res.rows[0])
        //see log for output
      })
     .catch(e => console.error(e.stack))

    // sample query returning current time...
     return client.query('SELECT NOW() as now')
           .then((res) => { 
               console.log(res.rows[0]);
               agent.add(`Welcome to my agent! Time is  ${res.rows[0].now}!`);
           })
           .catch(e => console.error(e.stack))

  }

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

  // Run the proper function handler based on the matched Dialogflow intent name
  let intentMap = new Map();
  intentMap.set('welcome', welcome);
  intentMap.set('Default Fallback Intent', fallback);
  // intentMap.set('your intent name here', yourFunctionHandler);
  // intentMap.set('your intent name here', googleAssistantHandler);
  agent.handleRequest(intentMap);

});

консоль ElephantSQL

console

Журналы Firebase

logs

Google Assistant

assistant

Я использовал ElephantSQL для демонстрации здесь.Ищите больше запросов .Убедитесь, что вы поставили return перед их успешным выполнением и избегайте "MalformedResponse: Webhook error (206)"!

Надеюсь, что ответит на все ваши запросы.Удачи!

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