Я пытаюсь добавить данные в базу данных 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);
});