nodejs连接mysql进行数据库查询返回前台数据的坑

之前本来想用mongodb进行数据库的操作,后来一想自己之前简单的用过mysql,就直接使用了mysql,一下午的时间一直走在nodejs查询数据然后返回给前台的这个过程,怎么说呢,在这个过程遇到了两个深坑。这两个坑都是在model中查询的数据不能返给前台遇到的。具体是啥呢就一步一步的走下去
坑1.查询到的数据需要进行json转换 在model中进行数据的查询后,一直获取的是RowDataPacket数据,而不是真正的json数据格式,如下
models层中的article.js

module.exports = { getArticleList:function(){ varsql = 'SELECT * FROM article'; var user = ''; dbCon.query(sql,function (err, result) { if(err){ console.log('[SELECT ERROR] - ',err.message); return; }else{ console.log(result) } }); } }

控制台打印result如图

nodejs连接mysql进行数据库查询返回前台数据的坑
文章图片
image.png
很明显这个地方是个rowdatapacket数据,而我们平时前台拿到的数据基本都是json格式,所以这里需要进行json的转换代码如下
getArticleList:function(){ varsql = 'SELECT * FROM article'; var article = ''; dbCon.query(sql,function (err, result) { if(err){ console.log('[SELECT ERROR] - ',err.message); return; }else{ var dataString = JSON.stringify(result); var data = https://www.it610.com/article/JSON.parse(dataString); console.log(data) article = data; } }); } return article; }

打印结果如下

nodejs连接mysql进行数据库查询返回前台数据的坑
文章图片
image.png
形如这种格式,数组内套json的才是前台需要的数据,上面这些的第一个坑,
坑2.因为js的单线程,异步操作,在发送数据给前台的时候需要进行异步操作的处理 在上面的代码中我在查询完数据后复制给article变量,最后将数据返回出去。正常来说,在express发送给前端的接口中直接获取数据返回就可以了,但是,恰恰不如愿,获取到的数据一直是空,这里就是因为js单线程,异步操作的原因,他不会等到数据查询完之后把数据复制给article,而是一直执行先的步骤,所以为了解决这个问题,我也是倒腾了一下午,最终的解决办法就是使用es6语法中的promise,解决异步操作。具体上代码
var dbCon=require('../db').dbCon; dbCon.connect(); module.exports = { /** * @function 获取文章列表 */ getArticleList:function(){ varsql = 'SELECT * FROM article'; var user = ''; var p = new Promise((res,rej)=>{ dbCon.query(sql,function (err, result) { if(err){ console.log('[SELECT ERROR] - ',err.message); return; }else{ //坑1 查询的数据不是json 是一个rowdatapocket对象 var dataString = JSON.stringify(result); var data = https://www.it610.com/article/JSON.parse(dataString); res(data); } }); }); return p; } }

【nodejs连接mysql进行数据库查询返回前台数据的坑】这是一个简单promise,在这里我只是查询成功以后给其回调的函数res进行赋值调用,然后在函数最外面返回promise。而在接口中我们去调用,如下
var express = require('express'); var router = express.Router(); var Article = require('../models/user'); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: '登录' }); }); /* GET home page. */ router.get('/login', function(request, response, next) { Article .getArticleList() .then((res,rej) =>{ response.send(res) })}); module.exports = router;

在接口中我们去调用getArticleList这个函数返回的是promise对象,在这个对象中我们去调用then(res,rej)其中res是在article.js文件中成功返回的内容就是我们进行数据的查询的内容。
然后在浏览器输入地址就可以获取到我们的数据,
如下

nodejs连接mysql进行数据库查询返回前台数据的坑
文章图片
image.png

    推荐阅读