MySQL登录错误

第一次登陆的时候,MySQL报如下错误

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
这个问题我以为发生是我登录root用户时忘记输入密码,输入密码后报错如下
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

这我就有点慌了。去查了下解决方案,是覆盖掉root用户的密码就好了。

NodeJS在与远程数据库连接时报错

之前通过WorkBench与远程数据库成功建立文件。之后开始下一步,在NodeJS工程文件中通过npm安装mysql组件后,参照GitHub文档开始准备与数据库建立连接。首次运行后控制台报错

ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

这个问题看似是由于数据库版本过低导致不支持远程连接的,但是我更新了服务端和客户端的MySQL与NodeJS的mysql组件,此问题依然存在。

在多方查询资料后得知此问题其实是由于NodeJS支持的mysql版本过低/不支持严格加密,解决方法也很简单,只需要把被连接的数据库的加密方式改为普通加密就好了

更改严格加密为普通加密的SQL代码如下

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'
FLUSH PRIVILEGES;
或者在WorkBench等GUI管理软件中找到并修改为普通加密就好了
NodeJS在对SQL进行查询操作后返回结果
NodeJS的相比与其他服务器端语言的优势与难点是它的异步功能。几乎所有NodeJS的I/O操作都是异步的,这也就导致在使用时经常会出现不能正常理解的“诡异”现象。
在建立了与远程数据库的连接后,使用mysql组件查询远程数据,查询结果能正确在控制台输出,但是无论如何也不能通过对象返回。这是因为mysql组件的查询方法是异步的,在查询完毕前已经返回了空的结果对象。
虽然可以用强制同步来解决这个问题,但是我觉得不够优雅,最终打算使用ECMAScript6的引入的新特性Promise来解决。
Promise的作用是让原本异步执行的代码变成类似同步执行,就是在执行完之后,状态会确定,此时调用.then方法会将状态确定后的结果返回,具体教程可以看下面的连接
我的实现方法代码贴在下面
function query () {
// 使用Promise更改异步操作为同步操作,使得回调函数能正确执行
let promise = new Promise(function (resolve, reject) {
// 建立连接
connection.connect(function (err) {
if (err) {
console.error('Error connecting: ' + err.stack);
return;
}
console.log('Connected as id ' + connection.threadId);
});
// TODO: 假设数据库中代表场景序号的属性为 scene_no
let querySql = 'SELECT * FROM test;'
connection.query(querySql, function (err, result) {
if (err) {
console.log('[SELECT ERROR] - ', err.message);
return 0;
}
resolve(result);
});
// 终止连接
connection.end();
});
promise.then(function (queryResult) {
console.log(queryResult);
return queryResult;
}, function (value) {});
return promise;
}