#node.js #node-mysql
#node.js #узел-mysql
Вопрос:
var mysql = require('mysql');
var con = mysql.createConnection({
host: "localhost",
user: "***",
password: "***",
database: "***"
});
case 'customer.updated':
//il cliente ha aggiornato indirizzo mail nel portale e io devo fare lo stesso
con.connect(function(err) {
if (err) throw err;
console.log("Connected!");
var sql = "UPDATE utenze SET email='" data.object.email "' WHERE stripe_customer='" data.object.id "'";
con.query(sql, function (err, result) {
if (err) throw err;
console.log("Customer record updated");
});
});
С помощью следующего кода я обычно выполняю первый запрос после запуска сервера узла. Второй запрос выдаст следующую ошибку:
Ошибка: не удается поставить рукопожатие в очередь после того, как оно уже поставлено в очередь.
Я понимаю значение ошибки, и я знаю, что должен исправить одновременные подключения, которые я выполняю параллельно с MySQL. Чего я не понимаю, так это как я должен переписывать код, поскольку я все еще учусь с node.
Я также читал, что создание пула соединений может решить проблему (вероятно, потому, что он не будет жаловаться, если я открою два соединения для одного и того же запроса), но полезно ли это реализовать при исправлении ошибки?
Комментарии:
1. Помните об уязвимости SQL injection. Всегда используйте параметризованные запросы.
2. @Alejandro да, спасибо. Это упрощенный код проблемы. Вся производственная среда состоит из параметризованных запросов.
3. Используйте con.connect один раз и передавайте соединение, когда хотите выполнить запрос. Таким образом, вы создаете соединение только один раз. В вашем фрагменте кода вы каждый раз создаете соединение.
4. @RajikaImal да, я знаю, что это проблема, как я написал в вопросе. Мой вопрос в том, как я это делаю. 🙂
Ответ №1:
Трудно сказать, поскольку код не является полным контроллером, но выглядит как con
глобальный, и вы запускаете con.connect()
его каждый раз, когда поступает входящий запрос. Вы должны con.connect()
только один раз. Таким образом, первый раз работает, а второй раз выдает ошибку «уже рукопожатие».
Попробуйте перейти на пул соединений, тогда легче определить, где вы резервируете соединение и где вы возвращаете его обратно в пул.
Комментарии:
1. ДА. Con определяется глобально и используется в разных местах. Как мне переписать часть запроса, чтобы избежать повторного вызова con? Это мой вопрос
2. @LelioFaieta возможно, измените реализацию на использование пула соединений и свяжитесь с нами, если это все еще не работает
3. Ваш ответ не добавляет ни одного байта информации к тому, что я уже указал в своем вопросе.