Javascript Mysql node.js间歇性连接问题

Javascript Mysql node.js间歇性连接问题,javascript,mysql,node.js,Javascript,Mysql,Node.js,在node.js应用程序中,我使用mysql库进行数据库连接 当我启动节点服务器时,我可以很好地查询数据库–没有问题 当我在5分钟后查询数据库时,服务器返回以下错误: {"code":"PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR","fatal":false} 如果我重新启动node.js服务器,我可以再次查询,而不会出现任何问题 这是我的密码 const mysql = require('mysql'); let connection = mysql.creat

在node.js应用程序中,我使用mysql库进行数据库连接

当我启动节点服务器时,我可以很好地查询数据库–没有问题

当我在5分钟后查询数据库时,服务器返回以下错误:

{"code":"PROTOCOL_ENQUEUE_AFTER_FATAL_ERROR","fatal":false}
如果我重新启动node.js服务器,我可以再次查询,而不会出现任何问题

这是我的密码

const mysql = require('mysql');


let connection = mysql.createPool({
  host: config.mysql.host,
  user: config.mysql.user,
  password: config.mysql.password,
  database: config.mysql.database
});


router.post('/subscription', (req, res) => {
  const user = req.body;
  const q = 'INSERT into Subscription SET ?';
  connection.query(q, user, (err, results) => {
    if (err)
      return res.json(err);
    return res.json(results);
  });
});
我使用了mysql.createConnection和mysql.createPool…。还尝试使用connection.end…手动结束连接


两个结果都以相同的错误结束。

您需要从池中获取连接并使用该连接,而不是查询池本身。当您从池中获得连接时,池将确保您从池中获得有效连接。所以你的代码应该是:

const mysql = require('mysql');


let pool = mysql.createPool({
  host: config.mysql.host,
  user: config.mysql.user,
  password: config.mysql.password,
  database: config.mysql.database
});


router.post('/subscription', (req, res) => {
  const user = req.body;
  const q = 'INSERT into Subscription SET ?';
  pool.getConnection(function(err, connection) {
     if (err)
       return res.json(err);

     connection.query(q, user, (err, results) => {
       if (err)
         return res.json(err);
       return res.json(results);
     });
  })
});
const mysql = require('mysql');

let pool = mysql.createPool({
  host: config.mysql.host,
  user: config.mysql.user,
  password: config.mysql.password,
  database: config.mysql.database
});


router.post('/subscription', (req, res) => {
  const user = req.body;
  const q = 'INSERT into Subscription SET ?';
  pool.query(q, user, function(err, connection) {
     if (err)
       return res.json(err);

     return res.json(results);
  });
});
更新

您不需要单独执行pool.getConnection和connection.query,您可以将它们组合到pool.query中,pool.query将获得连接,执行查询并释放连接。因此,更新后的代码将是:

const mysql = require('mysql');


let pool = mysql.createPool({
  host: config.mysql.host,
  user: config.mysql.user,
  password: config.mysql.password,
  database: config.mysql.database
});


router.post('/subscription', (req, res) => {
  const user = req.body;
  const q = 'INSERT into Subscription SET ?';
  pool.getConnection(function(err, connection) {
     if (err)
       return res.json(err);

     connection.query(q, user, (err, results) => {
       if (err)
         return res.json(err);
       return res.json(results);
     });
  })
});
const mysql = require('mysql');

let pool = mysql.createPool({
  host: config.mysql.host,
  user: config.mysql.user,
  password: config.mysql.password,
  database: config.mysql.database
});


router.post('/subscription', (req, res) => {
  const user = req.body;
  const q = 'INSERT into Subscription SET ?';
  pool.query(q, user, function(err, connection) {
     if (err)
       return res.json(err);

     return res.json(results);
  });
});

我可能应该把释放连接放在那里的某个地方