【问题标题】:How to connect to local mariadb server with node.js如何使用 node.js 连接到本地 mariadb 服务器
【发布时间】:2019-04-04 23:32:45
【问题描述】:

我正在尝试使用 node.js 连接到本地 mariadb 服务器。当我尝试连接时出现错误:

“错误: (conn=8, no: 1045, SQLState: 28000) 用户'root'@'localhost' 的访问被拒绝(使用密码:NO)”

我不知道为什么会这样,因为我在建立连接时设置了密码,我可以使用 root 密码登录到 mysql 服务器

 mysql -u root -p

这是我的代码的样子:

var mysql = require('mariadb');

var con = mysql.createConnection({
        host: "localhost",
        user: "root",
        password: "8pJcpe/h0h_%",
        port: 3306
        })
        .then(conn => {
                console.log("connected" + conn.threadId);
        })
        .catch(err => {
                console.log("got error " + err);
        });

我也尝试过使用端口 3307,并收到此错误: "错误:连接 ECONNREFUSED 127.0.0.1:3307"

当我尝试使用我用来 ssh 到服务器的端口时,我得到这个不同的错误: " 错误: (conn=-1, no: 45009, SQLState: 08S01) 套接字已意外关闭”

我是新手,我需要一些帮助。谢谢。

【问题讨论】:

  • 哪个版本的 MariaDB Node.js 连接器有这个问题,不提供 password

标签: mysql node.js mariadb fedora


【解决方案1】:

一些关键的想法:

  • MySQL 用户由用户主机识别。
  • 在 MySQL 中,localhost 表示本地套接字连接,而不是 TCP/IP 环回。

这个:

mysql -u root -p

将使用本地套接字连接;这将匹配 mysql.user 表行user='root' and host='localhost'

强制 TCP/IP 连接:

mysql -h 127.0.0.1 -u root -p

这将匹配 mysql.user 中的一行,例如 user='root' and host='127.0.0.1'user='root' and host='%'

mysql.user 中的每一行都是一个单独的用户; user='root'host 的不同值可以有多行。这些行中的每一行代表不同的用户,每个用户都有自己的权限和密码(或身份验证方法)。


对于 mariadb node.js 驱动程序

使用 host 选项,我们将尝试 TCP/IP 连接。

要通过本地套接字文件获得连接(即等效于mysql -u root -p,我们需要使用socketPath 而不是host 选项。

https://mariadb.com/kb/en/library/nodejs-connection-options/


如果我们想让 node.js 中的 TCP/IP 连接正常工作,那么我们应该首先确保mysql -h 127.0.0.1 -u root -p 连接正常工作。

【讨论】:

  • 谢谢你。它肯定会清除一些东西,但我仍然没有得到结果。我尝试的第一件事是确保我可以使用连接“mysql -h 127.0.0.1 -u root -p”的 TCP/IP 登录,我可以。所以然后我更改了我的代码,以便主机是“127.0.0.1”,当我运行它时,我得到了与以前相同的错误消息。我还尝试使用“socketPath”而不是“主机”,并使用了我在 my.cnf 文件中找到的路径,但这也不起作用,我也遇到了与以前相同的错误。
  • 错误消息“Access denied for user 'root'@'localhost' (using password: NO)”的正文似乎表明未提供密码。并且用户@'localhost' 使它看起来是尝试的本地套接字连接(而不是 TCP/IP)。所以我很困惑。我们可以让mysql命令行客户端发出同样的错误吗?省略仅发出 mysql -u root 的密码? (如果我们提供了错误的密码,我们应该能够得到错误using password: YES。)
  • 我们可能会尝试的另一件事是遵循 MariaDB 知识库中展示的编码模式,使用 createPoolgetConnection mariadb.com/kb/en/library/…
  • 因此,只需执行mysql -u root,我就会得到“用户'root'@'localhost'(使用密码:NO)的访问被拒绝”响应。但是,如果我尝试登录并提供错误的密码,我会收到 (using password: YES) 响应。我刚刚使用 TCP/IP 连接再次尝试以确保:var con = mysql.createConnection({ host: "127.0.0.1", user: "root", password: "8pJcpe/h0h_%", port: 3306 这会吐出错误 Access denied for user 'root'@'localhost' (using password: NO)
  • 我刚刚尝试使用他们展示的池方法,但不幸的是得到了同样的错误
【解决方案2】:

我能够解决这个问题。由于某种原因,在使用 mariadb 时,它不会识别出我正在为其提供密码。所以我不得不切换到 mysql 并改用它,然后我才能连接和查询数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-13
    • 2022-10-16
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多