NodeJS与MySQL首次连接中出现的一些小问题

Posted simon-ghost-riley

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

以上是关于NodeJS与MySQL首次连接中出现的一些小问题的主要内容,如果未能解决你的问题,请参考以下文章

具有多个查询的NodeJS mysql连接池

mysql建立索引的一些小规则

mysql建立索引的一些小规则

使用Nodejs的mysql模块连接MySql数据库出现以下错误

MongoDB 与 Docker “首次连接时无法连接到服务器 [localhost:27017]”

MongoDB 与 Docker “首次连接时无法连接到服务器 [localhost:27017]”