Где реализовать подключение к mysql, чтобы избежать ошибок?

#mysql #express

#mysql #экспресс

Вопрос:

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

Вот мой серверный код

 var express = require("express");
var app = express();
var bodyParser = require("body-parser");

var usersInstance = require("./database/users.js");
var foodInstance = require("./database/foods");

app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static("public"));
app.get("/", (req, res) => {
  // res.send("this is home page");
  res.render("index");
});

app.post("/auth", (req, res) => {
  // console.log(req.body);
  const userEmail = req.body.email;
  const password = req.body.password;
  console.log(userEmail, password);
  usersInstance.checkUser(userEmail, password, (err, userExists) => {
    console.log(err, userExists);
    if (userExists) res.send("user exists");
    else res.send("user does not exist");
  });
});

app.listen(3000, () => {
  console.log("app is listeneng at port 3000");
});
  

Вот мой код подключения к базе данных.

 const checkUser = (email, password, callback) => {
  connection.connect((err) => {
    if (!err) {
      connection.query(
        "SELECT * FROM Users WHERE email_id = ? AND password = ?",
        [email, password],
        (err, rows, columns) => {
          if (!err) {
            if (rows.length == 0) {
              callback(err, false);
            } else {
              callback(err, true);
            }
          } else {
            callback(err, null);
          }
        }
      );
    } else {
      callback(err, null);
      // connection.end();
    }
  });
};
  

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

 Error: Cannot enqueue Handshake after already enqueuing a Handshake.
    at Protocol._validateEnqueue (D:WEB DevelopmentAXILnode_modulesmysqllibprotocolProtocol.js:221:16)
    at Protocol._enqueue (D:WEB DevelopmentAXILnode_modulesmysqllibprotocolProtocol.js:138:13)
    at Protocol.handshake (D:WEB DevelopmentAXILnode_modulesmysqllibprotocolProtocol.js:51:23)
    at Connection.connect (D:WEB DevelopmentAXILnode_modulesmysqllibConnection.js:116:18)
    at Object.checkUser (D:WEB DevelopmentAXILdatabaseusers.js:63:14)
    at D:WEB DevelopmentAXILapp.js:21:17
    at Layer.handle [as handle_request] (D:WEB DevelopmentAXILnode_modulesexpresslibrouterlayer.js:95:5)
    at next (D:WEB DevelopmentAXILnode_modulesexpresslibrouterroute.js:137:13)
    at Route.dispatch (D:WEB DevelopmentAXILnode_modulesexpresslibrouterroute.js:112:3)
    at Layer.handle [as handle_request] (D:WEB DevelopmentAXILnode_modulesexpresslibrouterlayer.js:95:5) {
  code: 'PROTOCOL_ENQUEUE_HANDSHAKE_TWICE',
  fatal: false
  

Я предполагаю, что проблема в том, что connection.connect выполняется снова.
Может ли кто-нибудь помочь мне с этой проблемой?

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

Ответ №1:

Вам не нужно подключаться каждый раз, когда вы отправляете запрос — вам нужно использовать существующее соединение.

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

Создайте соединение:

 var mysql = require("mysql");

config = {
  connectionLimit: 50,
  host: "host",
  port: "3306",
  user: "blabla",
  password: "blabla",
  database: "blabla",
};

var connection = mysql.createPool(config);
  
 router.post("/getuserinfo", (req, res) => {
  const { user_phone } = req.body;

  //console.log(req.body);
  connection.getConnection(function (err, tempCont) {
    if (err) {
      res.send("Error occured.");
    } else {
      var sql =
        "SELECT * FROM Users WHERE email_id = ? AND password = ?;";
      connection.query(sql, [blabla], function (err2, result, fields) {
        if (err2) {
          console.log(err2);
        } else {
          res.send(result);
        }
        tempCont.release();
      });
    }
  });
});
  

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