首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为了避免错误,在哪里实现mysql连接?

为了避免错误,在哪里实现mysql连接?
EN

Stack Overflow用户
提问于 2020-08-29 20:57:21
回答 1查看 148关注 0票数 0

伙计们,我使用express js来运行我的服务器,我使用mysql作为数据库。

这是我的服务器代码

代码语言:javascript
运行
复制
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");
});

这是我的数据库连接代码。

代码语言:javascript
运行
复制
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();
    }
  });
};

每当我重新加载页面并再次输入用户详细信息时,我都会得到以下错误

代码语言:javascript
运行
复制
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再次被执行。有人能帮我解决这个问题吗?

有没有更好的方法可以把连接。连接方法,而不是在每个请求中使用它??

EN

回答 1

Stack Overflow用户

发布于 2020-08-29 21:12:55

您不必每次发送查询时都进行连接-您需要使用现有的连接。

在那之后,你需要释放连接,试着这样做:让它对你的函数起作用--这就是我使用它的方式。

创建连接:

代码语言:javascript
运行
复制
var mysql = require("mysql");

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

var connection = mysql.createPool(config);
代码语言:javascript
运行
复制
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更改为您的变量,当然,很遗憾我没有时间

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63647205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档