nodejs 无法连接到 maria db。可以通过命令行连接

问题描述 投票:0回答:1

连接到数据库时出现以下错误

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

无法理解问题所在

node.js mariadb
1个回答
0
投票

这听起来可能是网络连接问题。

您的节点应用程序是否与验证命令行的主机在同一主机上运行(具有相同的 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();
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.