#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 на ваши переменные, конечно, у меня не было времени, к сожалению