伙计们,我使用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 Development\AXIL\node_modules\mysql\lib\protocol\Protocol.js:221:16)
at Protocol._enqueue (D:\WEB Development\AXIL\node_modules\mysql\lib\protocol\Protocol.js:138:13)
at Protocol.handshake (D:\WEB Development\AXIL\node_modules\mysql\lib\protocol\Protocol.js:51:23)
at Connection.connect (D:\WEB Development\AXIL\node_modules\mysql\lib\Connection.js:116:18)
at Object.checkUser (D:\WEB Development\AXIL\database\users.js:63:14)
at D:\WEB Development\AXIL\app.js:21:17
at Layer.handle [as handle_request] (D:\WEB Development\AXIL\node_modules\express\lib\router\layer.js:95:5)
at next (D:\WEB Development\AXIL\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (D:\WEB Development\AXIL\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (D:\WEB Development\AXIL\node_modules\express\lib\router\layer.js:95:5) {
code: 'PROTOCOL_ENQUEUE_HANDSHAKE_TWICE',
fatal: false
我猜问题出在connection.connect
再次被执行。有人能帮我解决这个问题吗?
有没有更好的方法可以把连接。连接方法,而不是在每个请求中使用它??
发布于 2020-08-29 21:12:55
您不必每次发送查询时都进行连接-您需要使用现有的连接。
在那之后,你需要释放连接,试着这样做:让它对你的函数起作用--这就是我使用它的方式。
创建连接:
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更改为您的变量,当然,很遗憾我没有时间
https://stackoverflow.com/questions/63647205
复制相似问题