Тайм-аут при использовании Node.js MySQL внутри функций - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь добавить данные в базу данных MySQL через Node.js. Данные поступают от бота в Dialogflow, поэтому код для подключения и добавления строк находится внутри exports.dialogflowFirebaseFulfillment, и он запускается только тогда, когда пользователь заканчивает использование бота.

Он запускается, но занимаетдлительное время (6 с лишним минут в журналах) и время ожидания соединения (Error: connect ETIMEDOUT) или сбрасывается хостом (Error: read ECONNRESET) до завершения.

Просто для тестирования я переместил кодвне функции, поэтому он запускается сразу после развертывания кода и работает отлично.

Итак, это не работает:

'use strict';

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

var mysql      = require('mysql');
var pool  = mysql.createPool({
  host     : 'xxx',
  user     : 'xxx',
  password : 'xxx',
  database : 'xxx',
  connectionLimit : 10,
  acquireTimeout :  600000,
  connectTimeout :  600000
});

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });

  function getNameHandler(agent) {

  // do some things

    function createTable(conn){

const sql = "CREATE TABLE IF NOT EXISTS Clientes (\n"+
                  "ID int NOT NULL AUTO_INCREMENT,\n"+
                  "Nome varchar(150) NOT NULL,\n"+
                  "CPF char(11) NOT NULL,\n"+
                  "PRIMARY KEY (ID)\n"+
                  ");";

      conn.query(sql, function (error, results, fields){
          if(error) return console.log(error);
          console.log('criou a tabela!');
          addRows(pool);
      });
}

function addRows(conn){
  const sql = "INSERT INTO Clientes(Nome,CPF) VALUES ?";
  const values = [
        ['novo1', '12345678901'],
        ['novo2', '09876543210'],
        ['novo3', '12312312399']
      ];
  conn.query(sql, [values], function (error, results, fields){
          if(error) return console.log(error);
          console.log('adicionou registros!');
          conn.end(); //fecha a conexão
      });
}

    pool.getConnection(function(err){
     if(err) return console.log(err);
     console.log('conectou no pedido final');
     createTable(pool);
    });

    agent.add("user message");
}

  let intentMap = new Map();
  intentMap.set('Final', getNameHandler);
  agent.handleRequest(intentMap);
});

Это работает:

'use strict';

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

var mysql      = require('mysql');
var pool  = mysql.createPool({
  host     : 'xxx',
  user     : 'xxx',
  password : 'xxx',
  database : 'xxx',
  connectionLimit : 10,
  acquireTimeout :  600000,
  connectTimeout :  600000
});

 function createTable(conn){

const sql = "CREATE TABLE IF NOT EXISTS Clientes (\n"+
                  "ID int NOT NULL AUTO_INCREMENT,\n"+
                  "Nome varchar(150) NOT NULL,\n"+
                  "CPF char(11) NOT NULL,\n"+
                  "PRIMARY KEY (ID)\n"+
                  ");";

      conn.query(sql, function (error, results, fields){
          if(error) return console.log(error);
          console.log('criou a tabela!');
          addRows(pool);
      });
}

function addRows(conn){
  const sql = "INSERT INTO Clientes(Nome,CPF) VALUES ?";
  const values = [
        ['novo1', '12345678901'],
        ['novo2', '09876543210'],
        ['novo3', '12312312399']
      ];
  conn.query(sql, [values], function (error, results, fields){
          if(error) return console.log(error);
          console.log('adicionou registros!');
          conn.end(); //fecha a conexão
      });
}

    pool.getConnection(function(err){
     if(err) return console.log(err);
     console.log('conectou no pedido final');
     createTable(pool);
    });

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });

  function getNameHandler(agent) {

  // do some things

    agent.add("user message");
}

  let intentMap = new Map();
  intentMap.set('Final', getNameHandler);
  agent.handleRequest(intentMap);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...