Не удается выполнить авторизацию после вызова quit

Здесь я делаю, возможно какую-то основную ошибку. В общем, я реализовал такой код:

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(); } } 

И все работает отлично, но только в первый раз. Если я хочу «использовать» запрос во второй раз, я получаю его ошибку:

Не удается выполнить авторизацию после вызова quit

Я пробовал не подключаться .end (), но это не помогает
заранее спасибо
Радек

Если вы используете модуль node-mysql, просто удалите .connect и .end. Просто решил проблему сам. По-видимому, они вставляли ненужный код в свою последнюю итерацию, которая также прослушивалась. Вам не нужно подключаться, если вы уже запустили вызов createConnection

В соответствии с:

TL; DR Вам необходимо установить новое соединение, вызвав метод createConnection после каждого отключения.

а также

Примечание. Если вы обслуживаете веб-запросы, вы не должны заканчивать соединения по каждому запросу. Просто создайте соединение при запуске сервера и используйте объект connection / client для запроса все время. Вы можете прослушивать событие ошибки, чтобы справиться с отключением сервера и повторным подключением. Полный код здесь .


Из:

В нем говорится:

Отключение сервера

Вы можете потерять соединение с сервером MySQL из-за проблем с сетью, время синхронизации сервера или сбоя сервера. Все эти события считаются фатальными ошибками и будут иметь err.code = 'PROTOCOL_CONNECTION_LOST' . Дополнительную информацию см. В разделе Обработка ошибок.

Ниже приведен лучший способ справиться с такими неожиданными отключениями:

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

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

С пулом отсоединенные соединения будут удалены из пула, освобождая место для нового соединения, которое будет создано при следующем вызове getConnection.


Я изменил функцию таким образом, что каждый раз, когда соединение необходимо, функция инициализатора автоматически добавляет обработчики:

 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; } 

Инициализация соединения:

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

Незначительное предложение: это может не относиться ко всем, но я столкнулся с незначительной проблемой, связанной с областью. Если ОП считает, что это редактирование не нужно, он может выбрать его удалить. Для меня мне пришлось изменить строку в initializeConnection , которая была var connection = mysql.createConnection(config); просто

 connection = mysql.createConnection(config); 

Причина в том, что если connection является глобальной переменной в вашей программе, тогда проблема была в том, что вы делали новую переменную connection при обработке сигнала ошибки. Но в моем nodejs-коде я продолжал использовать одну и ту же глобальную переменную connection для запуска запросов, поэтому новое connection будет потеряно в локальной области метода initalizeConnection . Но в модификации он гарантирует, что глобальная переменная connection сбрасывается. Это может иметь значение, если вы столкнулись с проблемой, известной как

Невозможно задать запрос после фатальной ошибки

после попытки выполнить запрос после потери соединения, а затем успешно повторно подключиться. Возможно, это была опечатка OP, но я просто хотел уточнить.

У меня была та же проблема, и Google привел меня сюда. Я согласен с @Ata, что неправильно удалить end() . После дальнейшего Googling, я думаю, что использование pooling – лучший способ.

node-mysql doc о пуле

Это вот так:

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

Не соединяйте () и end () внутри функции. Это вызовет проблемы при повторных вызовах функции. Сделать подключение только

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

один раз и повторно использовать это соединение.

Внутри функции

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

Я думаю, что этот вопрос похож на мой:

  1. Подключение к MySQL
  2. Завершить работу MySQL (не должен завершать сценарий узла)
  3. Запустить службу MySQL, узел восстанавливается в MySQL
  4. Запросить DB -> FAIL (Невозможно задать запрос после фатальной ошибки.)

Я решил эту проблему, воссоздав новую связь с использованием обещаний (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); }); }; 

Надеюсь, это поможет.

РЕШЕНИЕ: для предотвращения этой ошибки (для AWS LAMBDA):

Чтобы выйти из цикла событий Nodejs, вы должны завершить соединение, а затем снова подключиться. Добавьте следующий код для вызова обратного вызова:

 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, }); }); 

в месте connection.connect(); .connect connection.connect(); использование –

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

если он уже вызван, то connection._connectCalled =true ,
& он не будет выполнять connection.connect() ;

note – не использовать connection.end();

  • У node.js эквивалент объекта window в браузере
  • Как подключиться к Postgres через Node.js
  • Express.js req.ip возвращает :: ffff: 127.0.0.1
  • Мне нужен планировщик Nodejs, который позволяет выполнять задания с разными интервалами
  • Как использовать socket.io в express-маршрутах?
  • Имя поля batchSize игнорируется в полевой проекции
  • Синхронные запросы к базе данных с помощью Node.js
  • Отключение HAProxy + WebSocket
  • Использовать переменную в Jade include
  • Загрузите файл с сервера NodeJS с помощью Express
  • AngularJS - визуализация на стороне сервера
  • Interesting Posts

    Как выполнить POST-сырое целое JSON в теле запроса на доработку?

    Учетные записи пользователя «Slave» в GNU / Linux

    Почему производители процессоров перестали увеличивать тактовую частоту своих процессоров?

    Получить процентное использование процессора

    Использование переменных внутри bash heredoc

    Наследование с нескольких интерфейсов с тем же именем метода

    Foreach Control в форме, как я могу что-то сделать для всех текстовых полей в моей форме?

    Android: рисование пользовательских фигур

    Как получить уникальный идентификатор устройства в Android?

    Проверка, работает ли приложение Android в фоновом режиме

    Как обнаружить клики системы «Недавние приложения» (Honeycomb +)

    Доступен ли Workbook.FileFormat для пользовательского интерфейса Excel (в частности, когда тип файла не может быть сохранен)

    Вкладка «Internet Explorer» для Opera

    Реализация шаблона пула объектов C #

    Что такое «реактор» в Maven?

    Давайте будем гением компьютера.