最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

MySQL连接结束后,Node.js服务器崩溃

IT培训 admin 8浏览 0评论

MySQL连接结束后,Node.js服务器崩溃

我有一个托管我的网页的Node.js服务器。我最近建立了一个MySQL服务器并创建了与服务器的连接。访问某个页面时,它会查询SQL数据库。

我的问题是,如果我查询数据库,它会使连接正常,但是当服务器自动关闭连接时它会稍后崩溃。然后我尝试在查询后使用con.end(),但这会导致第二次访问数据库时崩溃。它会抛出以下错误:

    at Protocol._validateEnqueue (/home/pi/Documents/node_modules/mysql/lib/protocol/Protocol.js:203:16)
    at Protocol._enqueue (/home/pi/Documents/node_modules/mysql/lib/protocol/Protocol.js:138:13)
    at Connection.query (/home/pi/Documents/node_modules/mysql/lib/Connection.js:200:25)
    at Handshake.con.connect (/home/pi/Documents/PageDB.js:26:9)
    at Handshake.<anonymous> (/home/pi/Documents/node_modules/mysql/lib/Connection.js:502:10)
    at Handshake._callback (/home/pi/Documents/node_modules/mysql/lib/Connection.js:468:16)
    at Handshake.Sequence.end (/home/pi/Documents/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
    at Handshake.Sequence.OkPacket (/home/pi/Documents/node_modules/mysql/lib/protocol/sequences/Sequence.js:92:8)
    at Protocol._parsePacket (/home/pi/Documents/node_modules/mysql/lib/protocol/Protocol.js:278:23)
    at Parser.write (/home/pi/Documents/node_modules/mysql/lib/protocol/Parser.js:76:12) code: 'PROTOCOL_ENQUEUE_AFTER_QUIT', fatal: false }
Close the database connection.

在我看来,这是由con.end()运行后执行的查询引起的。有人帮我找出一种方法,在回调返回SQL查询数据后调用结束函数?或者,当与DB的连接自动关闭时,我的Web服务器不会崩溃?我对任何一个开放。谢谢!

Node.js服务器的代码如下:

//Create a connection to the db
const con = mysql.createConnection({
  host: 'localhost',
  user: 'test',
  password: 'test',
  database: 'test',
});

router.get('/products',(req,res)=>{
  con.connect((err) => {
    if(err){
      console.log('Error relating to connection: ' + err);
      return;
    }
    console.log('Connection established');

    con.query('SELECT * FROM ProductList',(err,rows,fields)=>{
      if(!err)
        res.send(rows);
      else
        console.log(err);
    })
  });
  con.end(function(err) {
  if (err) {
    return console.log('error:' + err.message);
  }
  console.log('Close the database connection.');
  });
});
回答如下:

你的问题是你在con.end方法后正在调用connect。因为JS是异步的,所以它不会等待connect结束然后继续end而是它将调用connect并将回调放在event queue上并继续下一个声明你正在关闭你的连接。那么,你应该做的是在回调中移动你的end语句。尝试使用以下代码

//Create a connection to the db
const con = mysql.createConnection({
    host: 'localhost',
    user: 'test',
    password: 'test',
    database: 'test',
});

router.get('/products', (req, res) => {
    con.connect((err) => {
        if (err) {
            console.log('Error relating to connection: ' + err);
            return;
        }
        console.log('Connection established');

        con.query('SELECT * FROM ProductList', (err, rows, fields) => {
            if (!err) {
                res.send(rows);
                con.end(function(err) {
                    if (err) {
                        return console.log('error:' + err.message);
                    }
                    console.log('Close the database connection.');
                });
            } else
                console.log(err);
        })
    });

});

MySQL连接结束后,Node.js服务器崩溃

我有一个托管我的网页的Node.js服务器。我最近建立了一个MySQL服务器并创建了与服务器的连接。访问某个页面时,它会查询SQL数据库。

我的问题是,如果我查询数据库,它会使连接正常,但是当服务器自动关闭连接时它会稍后崩溃。然后我尝试在查询后使用con.end(),但这会导致第二次访问数据库时崩溃。它会抛出以下错误:

    at Protocol._validateEnqueue (/home/pi/Documents/node_modules/mysql/lib/protocol/Protocol.js:203:16)
    at Protocol._enqueue (/home/pi/Documents/node_modules/mysql/lib/protocol/Protocol.js:138:13)
    at Connection.query (/home/pi/Documents/node_modules/mysql/lib/Connection.js:200:25)
    at Handshake.con.connect (/home/pi/Documents/PageDB.js:26:9)
    at Handshake.<anonymous> (/home/pi/Documents/node_modules/mysql/lib/Connection.js:502:10)
    at Handshake._callback (/home/pi/Documents/node_modules/mysql/lib/Connection.js:468:16)
    at Handshake.Sequence.end (/home/pi/Documents/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
    at Handshake.Sequence.OkPacket (/home/pi/Documents/node_modules/mysql/lib/protocol/sequences/Sequence.js:92:8)
    at Protocol._parsePacket (/home/pi/Documents/node_modules/mysql/lib/protocol/Protocol.js:278:23)
    at Parser.write (/home/pi/Documents/node_modules/mysql/lib/protocol/Parser.js:76:12) code: 'PROTOCOL_ENQUEUE_AFTER_QUIT', fatal: false }
Close the database connection.

在我看来,这是由con.end()运行后执行的查询引起的。有人帮我找出一种方法,在回调返回SQL查询数据后调用结束函数?或者,当与DB的连接自动关闭时,我的Web服务器不会崩溃?我对任何一个开放。谢谢!

Node.js服务器的代码如下:

//Create a connection to the db
const con = mysql.createConnection({
  host: 'localhost',
  user: 'test',
  password: 'test',
  database: 'test',
});

router.get('/products',(req,res)=>{
  con.connect((err) => {
    if(err){
      console.log('Error relating to connection: ' + err);
      return;
    }
    console.log('Connection established');

    con.query('SELECT * FROM ProductList',(err,rows,fields)=>{
      if(!err)
        res.send(rows);
      else
        console.log(err);
    })
  });
  con.end(function(err) {
  if (err) {
    return console.log('error:' + err.message);
  }
  console.log('Close the database connection.');
  });
});
回答如下:

你的问题是你在con.end方法后正在调用connect。因为JS是异步的,所以它不会等待connect结束然后继续end而是它将调用connect并将回调放在event queue上并继续下一个声明你正在关闭你的连接。那么,你应该做的是在回调中移动你的end语句。尝试使用以下代码

//Create a connection to the db
const con = mysql.createConnection({
    host: 'localhost',
    user: 'test',
    password: 'test',
    database: 'test',
});

router.get('/products', (req, res) => {
    con.connect((err) => {
        if (err) {
            console.log('Error relating to connection: ' + err);
            return;
        }
        console.log('Connection established');

        con.query('SELECT * FROM ProductList', (err, rows, fields) => {
            if (!err) {
                res.send(rows);
                con.end(function(err) {
                    if (err) {
                        return console.log('error:' + err.message);
                    }
                    console.log('Close the database connection.');
                });
            } else
                console.log(err);
        })
    });

});
发布评论

评论列表 (0)

  1. 暂无评论