No se puede poner en enlace el saludo después de invocar salir

Aquí estoy, propagablemente, un error básico. En general, he implementado un código como este:

module.exports = { getDataFromUserGps: function(callback) { connection.connect(); connection.query("SELECT * FROM usergps", function(err, results, fields) { if (err) return callback(err, null); return callback(null, results); } ); connection.end(); }, loginUser: function(login, pass, callback) { connection.connect(); connection.query( "SELECT id FROM users WHERE login = ? AND pass = ?", [login, pass], function(err, results, fields) { if (err) return callback(err, null); return callback(null, results); } ); connection.end(); }, getUserDetails: function(userid, callback) { connection.connect(); connection.query( "SELECT * FROM userProfilDetails LEFT JOIN tags ON userProfilDetails.userId = tags.userId WHERE userProfilDetails.userid = ?", [userid], function(err, results, fields) { if (err) return callback(err, null); return callback(null, results); } ); connection.end(); }, addTags: function(userId, tags) { connection.connect(); connection.query( "INSERT INTO tag (userId, tag) VALUES (?, ?)", [userId, tags], function(err, results, fields) { if (err) throw err; } ) connection.end(); } } 

Y todo funciona bien, pero solo por primera vez, si quiero “usar” la consulta por segunda vez recibo su error:

No se puede poner en enlace el saludo después de invocar salir

He intentado no .end () conexiones, pero no ayuda
Gracias por adelantado
Radek

Si usa el módulo node-mysql, simplemente elimine .connect y .end. Acabo de resolver el problema yo mismo. Aparentemente introdujeron código innecesario en su última iteración que también está obstruido. No necesita conectarse si ya ha ejecutado la llamada createConnection

De acuerdo a:

TL; DR Necesita establecer una nueva conexión llamando al método createConnection después de cada desconexión.

y

Nota: Si está atendiendo solicitudes web, no debería finalizar las conexiones en cada solicitud. Simplemente cree una conexión al inicio del servidor y use el objeto de conexión / cliente para consultar todo el tiempo. Puede escuchar el evento de error para manejar la desconexión del servidor y para reconectarse. Código completo aquí .


De:

Dice:

El servidor se desconecta

Es posible que pierda la conexión a un servidor MySQL debido a problemas de red, el servidor lo interrumpe o el servidor se cuelga. Todos estos eventos se consideran errores fatales y tendrán err.code = 'PROTOCOL_CONNECTION_LOST' . Vea la sección Manejo de errores para más información.

La mejor manera de manejar tales desconexiones inesperadas se muestra a continuación:

 function handleDisconnect(connection) { connection.on('error', function(err) { if (!err.fatal) { return; } if (err.code !== 'PROTOCOL_CONNECTION_LOST') { throw err; } console.log('Re-connecting lost connection: ' + err.stack); connection = mysql.createConnection(connection.config); handleDisconnect(connection); connection.connect(); }); } handleDisconnect(connection); 

Como puede ver en el ejemplo anterior, la reconexión de una conexión se realiza estableciendo una nueva conexión. Una vez terminado, un objeto de conexión existente no se puede volver a conectar por diseño.

Con Pool, las conexiones desconectadas se eliminarán del grupo liberando espacio para que se cree una nueva conexión en la próxima llamada a getConnection.


He modificado la función de modo que cada vez que se necesita una conexión, una función de inicialización agrega los controladores automáticamente:

 function initializeConnection(config) { function addDisconnectHandler(connection) { connection.on("error", function (error) { if (error instanceof Error) { if (error.code === "PROTOCOL_CONNECTION_LOST") { console.error(error.stack); console.log("Lost connection. Reconnecting..."); initializeConnection(connection.config); } else if (error.fatal) { throw error; } } }); } var connection = mysql.createConnection(config); // Add handlers. addDisconnectHandler(connection); connection.connect(); return connection; } 

Inicializando una conexión:

 var connection = initializeConnection({ host: "localhost", user: "user", password: "password" }); 

Sugerencia menor: es posible que esto no se aplique a todos, pero me encontré con un problema menor relacionado con el scope. Si el OP considera que esta edición no es necesaria, puede elegir eliminarla. Para mí, tuve que cambiar una línea en initializeConnection , que era var connection = mysql.createConnection(config); simplemente simplemente

 connection = mysql.createConnection(config); 

La razón es que si la connection es una variable global en su progtwig, entonces el problema anterior era que estaba haciendo una nueva variable de connection al manejar una señal de error. Pero en mi código nodejs, seguí usando la misma variable de connection global para ejecutar consultas, por lo que la nueva connection se perdería en el ámbito local del método initalizeConnection . Pero en la modificación, se asegura que la variable de connection global se reinicie. Esto puede ser relevante si estás teniendo un problema conocido como

No se puede poner en cola la consulta después de un error fatal

después de intentar realizar una consulta después de perder la conexión y luego volver a conectarla con éxito. Esto pudo haber sido un error tipográfico por parte del OP, pero solo quería aclararlo.

Tuve el mismo problema y Google me condujo aquí. Estoy de acuerdo con @Ata en que no es correcto eliminar end() . Después de buscar en Google, creo que usar pooling es una mejor manera.

node-mysql doc sobre la agrupación

Es como esto:

 var mysql = require('mysql'); var pool = mysql.createPool(...); pool.getConnection(function(err, connection) { connection.query( 'bla bla', function(err, rows) { connection.release(); }); }); 

No conecte () y end () dentro de la función. Esto causará problemas en llamadas repetidas a la función. Haga la conexión solamente

 var connection = mysql.createConnection({ host: 'localhost', user: 'node', password: 'node', database: 'node_project' }) connection.connect(function(err) { if (err) throw err }); 

una vez y reutilizar esa conexión.

Dentro de la función

 function insertData(name,id) { connection.query('INSERT INTO members (name, id) VALUES (?, ?)', [name,id], function(err,result) { if(err) throw err }); } 

Creo que este problema es similar al mío:

  1. Conéctese a MySQL
  2. Fin del servicio MySQL (no debería salir del script del nodo)
  3. Inicie el servicio MySQL, el nodo se reconecta a MySQL
  4. Consultar el DB -> FAIL (No se puede poner en cola la consulta después del error fatal).

Resolví este problema recreando una nueva conexión con el uso de promesas (q).

mysql-con.js

 'use strict'; var config = require('./../config.js'); var colors = require('colors'); var mysql = require('mysql'); var q = require('q'); var MySQLConnection = {}; MySQLConnection.connect = function(){ var d = q.defer(); MySQLConnection.connection = mysql.createConnection({ host : 'localhost', user : 'root', password : 'password', database : 'database' }); MySQLConnection.connection.connect(function (err) { if(err) { console.log('Not connected '.red, err.toString().red, ' RETRYING...'.blue); d.reject(); } else { console.log('Connected to Mysql. Exporting..'.blue); d.resolve(MySQLConnection.connection); } }); return d.promise; }; module.exports = MySQLConnection; 

mysqlAPI.js

 var colors = require('colors'); var mysqlCon = require('./mysql-con.js'); mysqlCon.connect().then(function(con){ console.log('connected!'); mysql = con; mysql.on('error', function (err, result) { console.log('error occurred. Reconneting...'.purple); mysqlAPI.reconnect(); }); mysql.query('SELECT 1 + 1 AS solution', function (err, results) { if(err) console.log('err',err); console.log('Works bro ',results); }); }); mysqlAPI.reconnect = function(){ mysqlCon.connect().then(function(con){ console.log("connected. getting new reference"); mysql = con; mysql.on('error', function (err, result) { mysqlAPI.reconnect(); }); }, function (error) { console.log("try again"); setTimeout(mysqlAPI.reconnect, 2000); }); }; 

Espero que esto ayude.

SOLUCIÓN: para evitar este error (para AWS LAMBDA):

Para salir de “Nodejs event Loop”, debe finalizar la conexión y luego volver a conectarse. Agregue el siguiente código para invocar la callback:

 connection.end( function(err) { if (err) {console.log("Error ending the connection:",err);} // reconnect in order to prevent the"Cannot enqueue Handshake after invoking quit" connection = mysql.createConnection({ host : 'rds.host', port : 3306, user : 'user', password : 'password', database : 'target database' }); callback(null, { statusCode: 200, body: response, }); }); 

en lugar de connection.connect(); utilizar –

 if(!connection._connectCalled ) { connection.connect(); } 

si ya se llama, entonces connection._connectCalled =true ,
y no ejecutará connection.connect() ;

nota – no use connection.end();