mwe*_*k11 27 javascript mysql ubuntu node.js
我试图通过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 }
Run Code Online (Sandbox Code Playgroud)
奇怪的是,我可以通过运行连接到终端mysql -u root -p.运行我的javascript时,我只收到此错误.我一直在谷歌和StackOverflow,但仍然没有找到一个有效的解决方案.我在VIVTUAL MACHINE上使用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();
}
);
Run Code Online (Sandbox Code Playgroud)
我尝试在我的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';
Run Code Online (Sandbox Code Playgroud)
我也在127.0.0.1上运行了上面的内容.我也试过这个:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
Run Code Online (Sandbox Code Playgroud)
我试图重置root密码,如下所示:https: //help.ubuntu.com/community/MysqlPasswordReset
我FLUSH PRIVILEGES在每次尝试后都跑了.我已经停止并重新启动了mySQL.我完全卸载了mySQL并重新安装.
一切都无济于事.每次我尝试运行javascript时都会收到拒绝访问错误,但是当我通过终端连接到mySQL时,我绝对没有问题.
有任何想法吗?
小智 11
创建新用户(而不是使用 root)解决了我的问题。
mysql> CREATE USER 'new_user'@'%' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
然后授予:
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;
Run Code Online (Sandbox Code Playgroud)
然后更改凭据:
var connection = mysql.createConnection({
host : 'The mysql IP',
port : 'The mysql Port',
user : 'new_iser',
password : 'new_user_pass',
database : 'database-name'
});
Run Code Online (Sandbox Code Playgroud)
小智 10
尝试添加端口字段:
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
port: 3307
});
Run Code Online (Sandbox Code Playgroud)
我有一个类似的问题。我在 Docker 容器中运行 mysql 并在尝试从我的节点应用程序连接到它时遇到相同的错误。
看起来,我在没有暴露端口的情况下运行了 Docker 容器,因此它在容器内是 3306,但无法通过 localhost:3306 访问。为什么我收到 ER_ACCESS_DENIED_ERROR 错误是因为我实际上在端口 3306 上运行了其他一些 mysql 服务器,使用不同的用户名和密码。
要查看您是否在特定端口类型上运行或运行了什么:
ps axu | grep 3306
Run Code Online (Sandbox Code Playgroud)
由于我已经在端口 3306 上有一些东西,为了让我的应用程序可以访问服务器,我将端口更改为 3307 并使用以下命令运行我的 docker mysql 容器:
docker run --name=<name> -e MYSQL_ROOT_PASSWORD=<password> -p 3307:3306 -d mysql
Run Code Online (Sandbox Code Playgroud)
使用命令在 Docker 中启动 mysql 客户端后:
docker exec -it <name> mysql -u root -p
Run Code Online (Sandbox Code Playgroud)
在创建要连接的数据库后,我可以使用以下几行从我的节点应用程序连接到我的 mysql 数据库:
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'database',
port: 3307
});
connection.connect();
Run Code Online (Sandbox Code Playgroud)
希望对 docker 和 mysql 的新手有所帮助:)
小智 6
我有同样的问题,我通过将密码更改为空字符串来解决了。
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: ''
});
Run Code Online (Sandbox Code Playgroud)
小智 5
对于 mysql 版本 2.16.0(2018 年 9 月):
只需在 mysql 上创建一个新用户即可。
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';
Run Code Online (Sandbox Code Playgroud)
替换用户名和密码。
问题不在于 mysql 用户身份验证。只是您必须授予节点应用程序访问 mysql db 的权限。我之前也遇到过同样的问题。我添加了运行我的节点应用程序的端口号。现在它工作得很好。
另外 user:"root" 写成 username:"root" 。小心拼写。
const mysqlConnection = mysql.createConnection({
host: "localhost",
user: "root",
password: "Pass@123",
database: "employees",
port:"3000",
multipleStatements: true
Run Code Online (Sandbox Code Playgroud)
});
我正在使用 mysql 版本“mysql”:“^2.18.1”。
在package.json中使用最新的 MySQL 版本解决了该问题。
我使用的是2.0.0版本。我将版本更改为2.10.2。
| 归档时间: |
|
| 查看次数: |
39965 次 |
| 最近记录: |