Node中使用mysql模块遇到的问题
Node的mysql模块,本人的感受就是不好用,各种报错,各种坑,有一个问题困扰了我很久,也不知道是不是我使用的方式不对,不过后来用easymysql模块解决了,我才深信这是一个坑。
问题描述:
假设有这么一个数据表table,它有两个字段index和name,在localhost:3000主页有一个按钮,上面写着“更新”,当我点击更新后会POST到localhost:3000/update,然后后台连接数据库进行更新操作每一条记录的name为“gdt”,更新完毕后回到主页,再重新按一下“更新”按钮,就会报错误,如下:
“{ [Error: Cannot enqueue Query after invoking quit.] code: 'PROTOCOL_ENQUEUE_AFTER_QUIT', fatal: false }”
下面代码,省略了模块的引入以及数据库的连接操作,我使用的是异步流程控制Async来使得异步查询变成同步查询,在流程结束的最后connection会end,路由会重定向到localhost:3000,讲道理的话当我重新按“更新”按钮时会继续进行更新操作,而不是报错
exports.update = function(req, res) {
    //获得需要所有记录信息
    function getInfo() {
        return new Promise((resolve, reject) => {
            connection.query('SELECT `index`,`name` from table', function(err, result) {
                if (err) {
                    console.log(err);
                } else {
                    resolve(result);
                }
            })
        })
    }
    // 将每一项的名字更新为gdt
    function updateName(info) {
        return new Promise((resolve, reject) => {
            var index = info['index'];
            connection.query("UPDATE  `table` SET `tableB`.`name` = 'gdt' WHERE `table`.`index` =?", index, function(err, result) {
                if (err) {
                    console.log(err);
                } else {
                    resolve('更新成功');
                }
            })
        })
    }
    async function update() {
        let result = '';
        //筛选出在公屏发言出现的环球uid和其对应的index
        var getinfoResult = await getInfo();
        for (let i = 0; i < getinfoResult.length; i++) {
            var updateResult = await updateName(getinfoResult[i]);
            console.log(updateResult);
        }
        return result?result:'success';
    }
    update().then(function(result) {
        console.log(result);
        //断开数据库连接
        connection.end();
       //回到主页
       res.redirect('/');
    })
}
这个问题我查阅了好多资料,问了好多人都没有得到解决,后来改用了easymysql模块就解决了,异步流程控制结束后页面重定向到首页,重新按下“更新”会执行更新操作,不会报错!
上面的代码并没有改成easymysql的语法,关于easymysql的用法可以参阅 https://github.com/aleafs/easymysql,不过还是建议Node项目结合像MongoDB这样的NoSQL数据库,要不是公司业务要求我是不会使用mysql的,囧~
Node中使用mysql模块遇到的问题的更多相关文章
- node.js使用mysql模块的坑
		
之前用node.js写的订餐系统,很容易挂掉,一直也没想去解决它.今天看了一下,试了试,原因是在连接数据库的时候没有对error事件进行处理,导致程序一直挂在那里,需要重启服务才能正常使用. ...
 - 常用SQL语句及在node中使用MySQL
		
摘要:一些重要的SQL命令 SELECT - 从数据库中提取数据 UPDATE - 更新数据库中的数据 DELETE - 从数据库中删除数据 INSERT INTO - 向数据库中插入新数据 CREA ...
 - Node中使用MySQL报错:TypeError: Cannot read property 'query' of undefined
		
Node中使用MySQL报错: TypeError: Cannot read property 'query' of undefined at /Users/sipeng/Desktop/彭思/201 ...
 - Node中的net模块提供的前端通信
		
Node中的net模块提供的前端通信 客户端 业务: 客户端现在要在终端输入内容,然后回车发送内容给服务器 解决: Node中提供了一个叫做 readline 的 模块用于读取命令行内容 [ 单行读取 ...
 - 关于node中两个模块相互引用却不会死循环的问题
		
关于node中两个模块相互引用却不会死循环的问题 node中是通过require来导入加载模块的,require有两个作用: 1.加载文件模块并执行里面的代码 2.拿到被加载文件模块导出的接口对象 现 ...
 - 在Node.js使用mysql模块时遇到的坑
		
之前写了个小程序Node News,用到了MySQL数据库,在本地测试均没神马问题.放上服务器运行一段时间后,偶然发现打开页面的时候页面一直处于等待状态,直到Nginx返回超时错误.于是上服务器检查了 ...
 - Node中的http模块
		
通过Node模块,我们可以实现客户端和服务器端.这篇文章主要研究如何利用http和一些相关模块构建客户端和服务器端代码.读完本文,将能够实现client向server发送数据,而server将数据原样 ...
 - Node中require第三方模块的规则
		
Node.js中使用CommonJs模块化机制,通过npm下载的第三方包,我们在项目中引入第三方包都是:let xx = require('第三方包名'),究竟require方法加载第三方包的原理机制 ...
 - node中npm安装模块的网络问题
		
最近使用node开发时,发现所有的依赖模块都安装不了啦,一直报错如下 rollbackFailedOptional: verb npm-session 5a4a66a1b8d06dc3 后来才发现是由 ...
 
随机推荐
- 详细grep、sed、awk
			
[root@VM_0_7_centos tmp]# cat 1.txt 1 2 3 4 5 6 [root@VM_0_7_centos tmp]# cat 2.txt 4 5 6 7 8 [root@ ...
 - inspect模块---检查活动对象
			
inspect模块提供了一些有用的函数来帮助获取有关活动对象(如模块,类,方法,函数,跟踪,框架对象和代码对象)的信息.例如,它可以帮助您检查类的内容,检索方法的源代码,提取和格式化函数的参数列表,或 ...
 - flink学习笔记-数据源(DataSource)
			
说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...
 - 模板【洛谷P3812】 【模板】线性基
			
P3812 [模板]线性基 给定n个整数(数字可能重复),求在这些数中选取任意个,使得他们的异或和最大. code: #include <iostream> #include <cs ...
 - nodejs post 数据到php $_POST["content"]接收不到的问题
			
今天写了一段代码,要用到ajax调用php的接口,因为是https的,所以ajax不能跨域,于是使用nodejs调用接口,但是传输数据后 $_POST["content"]接收不到 ...
 - js 伪数组 arguments
			
/* 定义一个函数,如果不确定用户是否传入了参数, arguments可以获取到函数传入了多少个参数 和每个参数的值 */ /* 定义 */ function f1() { //获取的是函数在调用的时 ...
 - COCO2018 全景分割
			
全景分割是18年新推出的一个任务,它要求同时分割出目标和背景,也就是既有实例分割也有语义分割,用官方的话讲是朝着真实世界视觉系统的重要一步 如图所示,里面既有对天空,草地等stuff的分割,也有对目标 ...
 - @staticmethod 和@classmethod区别
			
python中@classmethod @staticmethod区别 Python中3种方式定义类方法, 常规方式, @classmethod修饰方式, @staticmethod修饰方式. cla ...
 - python之读取文件的测试数据
			
假设我们有一个叫testdata.txt的文件,现在在这个文件里面有测试数据,我们怎么利用前2小章学习的知识,读取测试数据呢? 测试数据如下: url:https://www.cnblogs.com/ ...
 - DP小小结
			
入门题 : [Luogu1441]砝码称重 , [NOIP2015]子串 [AHOI2009]中国象棋 , 详见代码 [HNOI2007]梦幻岛宝珠 , 详见代码 [NOIP2012]开车旅行 , 没 ...