作为前言,我只使用了 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/