javascript - Node mysqljs。如何正确关闭连接

标签 javascript mysql node.js

我正在使用 mysqljs 通过 JavaScript 访问 MySQL。

我想指出的是,如果是单条数据,这个过程似乎工作得很好。 我正在向代码中输入大量数据,以批量方式逐行处理。

我像这样创建连接:

var connection = mysql.createConnection({
    //debug: ['ComQueryPacket'],
    host        : dataSource.host,
    user        : dataSource.user,
    password: dataSource.password,
    database: dataSource.database
});

我有三个进行数据库查询的函数。

包含 SELECT 查询的函数的构建如下:

dbSearch(data){
  var sql = "SELECT * from table where field =? and otherfield=?";
  return new Promise((resolve, reject) => {
    connection.query(sql, [data[0], data[1], (error, results, fields) => {
        if (error){
          console.log(error);
          reject("Database connection error: " + error);
         } else {
          resolve(results);
         }  
    });
  });
}

代码在另一个函数中执行:

if (dataItem){
  dbSearch(dataItem)
    .then((row) => {
        processingfunction(row);
    });

如果我省略了connection.end(),代码就会挂起,并且数据流会在第一个正在处理的项目处被阻止。

如果我将 connection.end() 放在函数内,我会收到此错误:

数据库连接错误:错误:调用退出后无法对查询进行排队。

我把connection.end()作为代码的最后一行,一切正常

问题在于更新和插入功能:

updateRecord(data){
  var sql = "UPDATE table set field=? where id=?";
  return new Promise((resolve, reject) => {
    connection.query(sql, [data[0], data[1], (error, results, fields) => {
     if (error){
      console.log(error);
      reject("Database connection error: " + error);
     } else {
      resolve(results);
     }
    });
  });
}

inputRecord(data){
  var sql = "INSERT INTO table (field1, field2, field3) VALUES(?,?,?)";
  return new Promise((resolve, reject) => {
    connection.query(sql, [data[0], data[1], data[2]], (error, results, fields) => {
      if (error){
        console.log(error);
        reject("Database connection error: " + error);
      } else {
        resolve(results);
      } 
    });
  });
}

使用函数中的connection.end(),我收到此错误。

Database connection error: Error: Cannot enqueue Query after invoking quit.
(node:40700) UnhandledPromiseRejectionWarning: Database connection error: Error: Cannot enqueue Query after invoking quit.
(node:40700) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:40700) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

根据文档,我不清楚如何正确处理关闭连接以便代码可以正确处理。

不知道我做错了什么。可以使用具有使用连接处理数据 block 以及如何正确处理关闭连接的经验的人的指导吗?

注意: 当我尝试连接池时,出现了类似的问题,因此这不是一个可行的解决方案。

最佳答案

你使用连接池,你不必手动关闭conn。有一个.query()方便的方法。由于您已经在使用 .query(),因此请勿在函数末尾将其关闭。

This is a shortcut for the pool.getConnection() -> connection.query() -> connection.release() code flow.

var mysql = require('mysql');
var pool  = mysql.createPool({
  connectionLimit : 10,
  host            : 'example.org',
  user            : 'bob',
  password        : 'secret',
  database        : 'my_db'
});

pool.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});

关于javascript - Node mysqljs。如何正确关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59259293/

相关文章:

javascript - jQuery 在带有图像映射的悬停时显示 div

来自 MySql 表解析器的 C# DataSet,属性中包含数据库字段名

php - MySQL 输出到 php echo

node.js - 在本地开发中使用 lambda 共享实用程序层

javascript - 如何使用 Material-ui 为 React Next 应用程序添加 CSS 服务器端渲染

javascript - 通过 data 属性内的对象值查找元素

javascript - 如何迭代 Redux State 对象

mysql - 来自 mysql 查询的重复结果

node.js - 特定包的 yarn 忽略引擎

javascript - 使用后退按钮或 Iron 路由后,Meteor 模板没有反应