node.js判断mysql是否连接_NodeJS与MySQL首次连接中出现的一些小问题

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值