问题描述
我正在尝试通过NodeJS文件连接到mySQL,但是收到以下错误:
{ Error: ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password: YES)
at Handshake.Sequence._packetToError (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/sequences/Sequence.js:30:14)
at Handshake.ErrorPacket (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/sequences/Handshake.js:67:18)
at Protocol._parsePacket (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Protocol.js:197:24)
at Parser.write (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Parser.js:62:12)
at Protocol.write (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Protocol.js:37:16)
at Socket.ondata (_stream_readable.js:555:20)
at emitOne (events.js:101:20)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
--------------------
at Protocol._enqueue (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Protocol.js:110:26)
at Protocol.handshake (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/protocol/Protocol.js:42:41)
at Connection.connect (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/Connection.js:81:18)
at Connection._implyConnect (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/Connection.js:222:10)
at Connection.query (/home/matthew/Node/mySqlTest/node_modules/mysql/lib/Connection.js:137:8)
at Object.<anonymous> (/home/matthew/Node/mySqlTest/index.js:11:12)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
code: 'ER_ACCESS_DENIED_ERROR',
errno: 1045,
sqlState: '28000',
fatal: true }
奇怪的是,我可以通过运行mysql -u root -p
在终端上正常连接。我只在运行JavaScript时收到此错误。我已经遍及Google和StackOverflow,但仍未找到有效的解决方案。我在虚拟机上的Ubuntu 16.04.1上使用MySQL 5.7.16。不知道VM是否在这里有所作为。我的Javascript代码如下:
'use strict';
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password'
});
connection.query(
'SELECT "foo" AS first_field, "bar" AS second_field',
function(err, results, fields) {
console.log(err);
console.log(results);
connection.end();
}
);
我已经尝试在我的JavaScript中使用’locahost’和’127.0.0.1’。我在mySql.user表中同时有’localhost’和’127.0.0.1’的’root’用户,我可以通过执行SELECT user, host FROM mysql.user WHERE user='root';
来查看
我通过执行以下操作为’root’用户添加了特权:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password';
我也在127.0.0.1上运行了上述代码。我也尝试过这个:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
我试图像这样重置根密码:https://help.ubuntu.com/community/MysqlPasswordReset
每次尝试后,我都运行FLUSH PRIVILEGES
。我已经停止并重新启动了mySQL。我已经完全卸载了mySQL并重新安装。
一切都无济于事。每次尝试运行javascript时,我都会收到拒绝访问错误,但是通过终端连接到mySQL时,我绝对没有问题。
有任何想法吗?
最佳方案
我有同样的问题,我通过将密码更改为空字符串来解决了。
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: ''
});
次佳方案
我有一个类似的问题。我在Docker容器中运行mysql,尝试从我的节点应用程序连接到它时遇到相同的错误。
看来,我在运行Docker容器时未公开端口,因此它位于容器内部3306,但无法通过localhost:3306进行访问。为什么出现ER_ACCESS_DENIED_ERROR错误,是因为我实际上在端口3306上运行了其他一些带有不同用户名和密码的mysql服务器。
要查看是否在特定端口类型上运行,请执行以下操作:
ps axu | grep 3306
由于我已经在端口3306上放置了一些东西,为了使服务器可被我的应用访问,我将端口更改为3307并使用以下命令运行docker mysql容器:
docker run --name=<name> -e MYSQL_ROOT_PASSWORD=<password> -p 3307:3306 -d mysql
在Docker内部使用命令启动mysql客户端后:
docker exec -it <name> mysql -u root -p
在创建要连接的数据库之后,我可以使用以下几行从节点应用程序连接至我的mysql数据库:
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'database',
port: 3307
});
connection.connect();
希望能帮助docker和mysql的新手:)
第三种方案
尝试添加端口字段:
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
port: 3307
});
第四种方案
创建新用户(而不是使用root)解决了我的问题。
mysql> CREATE USER 'new_user'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
然后授予:
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'new_user'@'%' WITH GRANT OPTION;
然后更改凭据:
var connection = mysql.createConnection({
host : 'The mysql IP',
port : 'The mysql Port',
user : 'new_iser',
password : 'new_user_pass',
database : 'database-name'
});
第五种方案
在package.json中使用最新的MySQL版本解决了该问题。
我正在使用2.0.0版。我将版本更改为2.10.2。