mysql - Nodejs : MySQL package seems to freeze after a short burt of queries?

标签 mysql sql asynchronous backend es6-promise

作为前言,我只使用了 Javascript 和 SQL 大约一周,所以请指出您在这里看到的任何糟糕的形式。

我正在编写一个快速服务器,它需要将多个 SQL 查询的结果合并到一个对象中。这使用了 mysql 节点插件。我有以下内容:

const db = require('./db.js');
var sql = 'SELECT * FROM departments';
db.query(sql, async function(err, dptrows){
  let departments = dptrows.map( d => d);

  for (let dindex = 0; dindex < departments.length; dindex++) {

    sql = 'SELECT * FROM dpt'+dindex+'itemtypes';

    console.log(sql);

    let curQuery = new Promise((resolve, reject) => {
        db.query(sql, (err, typerows) => {
        if (err) {
          reject(err);
        }
        else {
          resolve(typerows);
        }
      });
    }).catch(err => {});

    let typerows = await curQuery || [];
    departments[dindex].itemTypes = typerows;
    console.log(typerows);
  }

  console.log(departments);
});

下面是导入的db.js。诚然,这个文件的大部分内容都是 cargo 代码。

const mysql = require('mysql');

var pool = mysql.createPool({
  host : process.env.DB_HOST,
  user : process.env.DB_USER,
  password : process.env.DB_PASS,
  database : process.env.DB_DB,
  connnectionLimit:50,
  supportBigNumbers: true
});

exports.query = function(sql, data, callback) {

  pool.getConnection( function(err, connection) {

    if (err) {
      console.log(err);
      callback(true);
      return;
    }

    connection.query(sql, data, function(err, results) {
      connection.release();

      if (err) {
        console.log(err);
        callback(true);
        return;
      }

      callback(false, results);
    });
  });
};

运行时,它会输出以下内容:

SELECT * FROM dpt0itemtypes
[
  RowDataPacket {
    id: 1,
    name: 'placeholder item'
  }
]
SELECT * FROM dpt1itemtypes
[]
SELECT * FROM dpt2itemtypes
[]
SELECT * FROM dpt3itemtypes
[]
SELECT * FROM dpt4itemtypes

这里卡住了。直到最终 SELECT 语句为止的输出完全符合预期;在第一个查询之后,每个查询都会返回空白数组,因为 dpt1itemtypes 等是我尚未制作的表。但为什么它会在 dpt4itemtypes 上卡住?此查询的 promise 从未实现或拒绝,并且还有两个查询需要进行。

这是我的 mysql 池对象配置中的错误吗?也许我的 MySQL 服务器配置有错误?

最佳答案

好吧,这实际上很尴尬。

mysql.query 可以采用两个或三个参数,但我的 db.js 包装器仅调用采用三个参数的形式。它没有设置为处理两个参数查询方法的任何调用,因此上面的第一段代码是将回调函数传递给需要某种数组的函数。糟糕的事情接踵而至。

关于mysql - Nodejs : MySQL package seems to freeze after a short burt of queries?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57877225/

相关文章:

javascript - 如何在nodeJS的forEach中正确使用async

mysql - 添加您在 mysql 中创建的列?

sql - 从包含多个分隔值的列中提取一个值

mysql - 如何简化我的 SQL 请求?

mysql - 在 'count' 子句中包含多个表的 MySQL 查询中添加 'from'

javascript - GTM - 有没有办法在执行 enableSyncRendering() 和 enableServices() 后异步呈现广告?

node.js - 如何递归地遍历目录,通过 node.js 中的套接字发送所有文件名?

php通过单独数组的while循环循环数组

mysql - 如何从另一个表的 2 个变量更新一个表?

java - 使用jsp形式编辑MYSQL记录