连接到数据库时出现以下错误
node_server_1 | Error connecting to database: (conn=-1, no: 45028, SQLState: HY000) retrieve connection from pool timeout after 10002ms
node_server_1 | (pool connections: active=0 idle=0 limit=10)
node_server_1 | SqlError: (conn=-1, no: 45028, SQLState: HY000) retrieve connection from pool timeout after 10002ms
node_server_1 | (pool connections: active=0 idle=0 limit=10)
node_server_1 | at Object.module.exports.createError (/home/simha/app/node_modules/mariadb/lib/misc/errors.js:57:10)
node_server_1 | at Pool._requestTimeoutHandler (/home/simha/app/node_modules/mariadb/lib/pool.js:344:26)
node_server_1 | at listOnTimeout (node:internal/timers:559:17)
node_server_1 | at processTimers (node:internal/timers:502:7) {
node_server_1 | text: 'retrieve connection from pool timeout after 10002ms\n' +
node_server_1 | ' (pool connections: active=0 idle=0 limit=10)',
node_server_1 | sql: null,
node_server_1 | fatal: false,
node_server_1 | errno: 45028,
node_server_1 | sqlState: 'HY000',
node_server_1 | code: 'ER_GET_CONNECTION_TIMEOUT'
node_server_1 | }
这是我的代码
import dotenv from "dotenv";
import mariadb from "mariadb";
if (process.env.NODE_ENV !== "production") {
dotenv.config();
}
console.log(process.env.DB_HOST)
console.log(process.env.DB_USER)
console.log(process.env.DB_PASSWORD)
console.log(process.env.DB_NAME)
const pool = mariadb.createPool({
hostname: 'mariadb',
user: 'simha',
password: 'krishna',
database: 'blogs'
});
try {
console.log(process.env.DB_HOST,process.env.DB_USER,process.env.DB_PASSWORD,process.env.DB_NAME)
const conn = await pool.getConnection();
console.log("Connected to database.");
conn.release();
} catch (err) {
console.error("Error connecting to database:", err.message);
console.log(err)
await pool.end();
process.exit(1);
}
export default pool;
我可以使用命令行连接到数据库
mariadb --host mariadb -P 3306 --user simha –pkrishna
无法理解问题所在
这听起来可能是网络连接问题。
您的节点应用程序是否与验证命令行的主机在同一主机上运行(具有相同的 IP)?
例如:
https://stackoverflow.com/a/53418273/421195
问题是在 phpMyAdmin 中我没有添加我的家庭 IP 地址 这样我就可以连接了。对于那些刚刚开始使用它的人 - 你可以 创建多个具有相同名称和密码的用户,以便您可以 实际上可以从多个 IP 进行访问(例如 localhost、::1 或 127.0.0.1 完全相同,但仍然需要)。
我添加了具有相同凭据的其他用户,指向我的 IP 它解决了问题。
另一种可能性:
https://stackoverflow.com/a/68406734/421195
对于其他有相同错误消息的人,特别是如果连接 前几次有效,但之后就不行了,如果 你不会用 conn.end 结束连接。不是OP问题,而是 也许是其他人。
最后:一切可能实际上都正常工作:
https://stackoverflow.com/a/52225583/421195
池中的每个连接都会超时,因为使用release() 不会关闭连接,而是将其返回到池中。
所以你的断开连接是很正常的,你应该处理这个错误 适当地。
连接会自动重新创建,请参阅 https://github.com/mysqljs/mysql#poolcluster-options
这个例子可能会给你一些有用的提示:
https://stackoverflow.com/a/59761773/421195
重试使用setTimeout()连接:
'use strict'; const dbpool = require('mysql').createPool({ connectionLimit: 10, acquireTimeout: 30000, waitForConnections: true, database: 'mydatabase', host: 'localhost', multipleStatements: true, password: 'mypassword', user: 'root', }); const sql = 'SELECT * FROM sometable;'; const attemptConnection = () => dbpool.getConnection((err, connection) => { if (err) { console.log('error connecting. retrying in 1 sec'); setTimeout(attemptConnection, 1000); } else { connection.query(sql, (errQuery, results) => { connection.release(); if (errQuery) { console.log('Error querying database!'); } else { console.log('Successfully queried database.'); } }); } }); attemptConnection();