многократное подключение к базе данных mysql с узлового сервера, как исправить

#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. Ваш ответ не добавляет ни одного байта информации к тому, что я уже указал в своем вопросе.