gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 15:22:54 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com