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;
}

原文地址:https://www.cnblogs.com/simon-ghost-riley/p/12059078.html

时间: 2024-08-29 23:49:52

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

Ubuntu14.04安装mysql及过程中遇到的一点小问题

Ubuntu14.04出来有段时间了,前几天刚升级到这个版本,新鲜了一把.不过安装mysql时遇到了一点小问题,记录一下以备后用. 预备操作: 网上安装mysql的方法不少,大体有这么三种. 1. 从网上安装 sudo apt-get install mysql-server.装完已经自动配置好环境变量,可以直接使用mysql的命令. 2. 安装离线包,以mysql-5.0.45-linux-i686-icc-glibc23.tar.gz为例. 3. 二进制包安装:安装完成已经自动配置好环境变量

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

C:\Users\horn1\Desktop\node.js\39>node express.js { Error: Handshake inactivity timeout at Handshake.<anonymous> (C:\Users\horn1\Desktop\node.js\39\node_modules\mysql\lib\protocol\Protocol.js:164:17) at emitNone (events.js:105:13) at Handshake.em

怎么在连接中翻开新的小窗口?

functionnewPaghtmlurl{ varnewwin=window.openhtmlurl."toolbar=no,"newWin".location=no,directories=no,status=yes,menubar=no,scrollbars=yes,resizable=no,top=20,left=400,width=500,height=550"; newwin.focu; returnfalse; } servlet/getFriendS

Node.js使用MySQL的连接池

使用Nodejs+MySQL肯定比PHP和MySQL的组合更适合做服务器端的开发. 使用Nodejs你会从他的异步行为中获益良多.比如,提升性能,你无须在从已有的MySQL数据库迁移到其他的NoSQL数据库获得性能的提升.   Nodejs如何使用MySQL Nodejs要连接MySQL,可以使用Nodejs的MysQL驱动来实现.比如,我们这里使用“node-mysql”连接数据库.我们使用下面的方式来连接数据库: 首先,我们需要使用nodejs的包管理工具(npm)安装mysql的驱动.命令

Node.js如何使用MySQL的连接池实例

http://www.111cn.net/database/mysql/90774.htm Nodejs如何使用MySQL Nodejs要连接MySQL,可以使用Nodejs的MysQL驱动来实现.比如,我们这里使用"node-mysql"连接数据库.我们使用下面的方式来连接数据库: 首先,我们需要使用nodejs的包管理工具(npm)安装mysql的驱动.命令行如下: npm install musql 现在,要在js文件中使用mysql,添加下面的代码到你的文件中: var mys

Nodejs连接MySQL&amp;&amp;实现unity中的登陆注册功能

MySQL是一款常用的开源数据库产品,通常也是免费数据库的首选.查了一下NPM列表,发现Nodejs有13库可以访问MySQL,felixge/node-mysql似乎是最受关注项目,我也决定尝试用一下. 要注意名字,"felixge/node-mysql"非"node-mysql",安装目录 1. node-mysql介绍 felixge/node-mysql是一个纯nodejs的用javascript实现的一个MySQL客户端程序.felixge/node-my

nodejs mysql 创建连接池

用Nodejs连接MySQL 从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开20-30个网页都很流畅.Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性化网站,我们自己的Geek网站!! 关于作者 张丹(Conan), 程序员

nodejs + redis/mysql 连接池问题

nodejs + redis/mysql 连接池问题 需不需要连接池 连接池的作用主要是较少每次临时建立连接所带来的开销.初步一看,nodejs运行单线程上,它不能同时使用多个连接,乍一看是不需要连接池的.但是这只是我们初步下意识的感觉,下面我们详细分析来看看这个结论对是不对. 先从简单的redis开始. redis服务器也是运行在单线程上的.俩都是单线程,看起来更加坚定不需要连接池的结论了. 从详细的图像来看看nodejs 连接 redis用连接池有没有意义. 上图中,nodejs共有俩连接,

EF连接Mysql 表&#39;TableDetails&#39;中的列&#39;IsPrimaryKey&#39;的值为DBNull

无法生成模型,因为存在以下异常:'System.Data.StrongTypingException:表'TableDetails'中的列'IsPrimaryKey'的值为DBNull.---> System.InvalidCastException:指定的转换无效. 原文链接http://stackoverflow.com/questions/33575109/mysql-entity-the-value-for-column-isprimarykey-in-table-tabledetail