之前本来想用mongodb进行数据库的操作,后来一想自己之前简单的用过mysql,就直接使用了mysql,一下午的时间一直走在nodejs查询数据然后返回给前台的这个过程,怎么说呢,在这个过程遇到了两个深坑。这两个坑都是在model中查询的数据不能返给前台遇到的。具体是啥呢就一步一步的走下去
坑1.查询到的数据需要进行json转换
在model中进行数据的查询后,一直获取的是RowDataPacket数据,而不是真正的json数据格式,如下
models层中的article.js
module.exports = {
getArticleList:function(){
var sql = '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如图
image.png
很明显这个地方是个rowdatapacket数据,而我们平时前台拿到的数据基本都是json格式,所以这里需要进行json的转换代码如下
getArticleList:function(){
var sql = '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 = JSON.parse(dataString);
console.log(data)
article = data;
}
});
}
return article;
}
打印结果如下
image.png
形如这种格式,数组内套json的才是前台需要的数据,上面这些的第一个坑,
坑2.因为js的单线程,异步操作,在发送数据给前台的时候需要进行异步操作的处理
在上面的代码中我在查询完数据后复制给article变量,最后将数据返回出去。正常来说,在express发送给前端的接口中直接获取数据返回就可以了,但是,恰恰不如愿,获取到的数据一直是空,这里就是因为js单线程,异步操作的原因,他不会等到数据查询完之后把数据复制给article,而是一直执行先的步骤,所以为了解决这个问题,我也是倒腾了一下午,最终的解决办法就是使用es6语法中的promise,解决异步操作。具体上代码
var dbCon=require('../db').dbCon;
dbCon.connect();
module.exports = {
/**
* @function 获取文章列表
*/
getArticleList:function(){
var sql = '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 = JSON.parse(dataString);
res(data);
}
});
});
return p;
}
}
这是一个简单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文件中成功返回的内容就是我们进行数据的查询的内容。
然后在浏览器输入地址就可以获取到我们的数据,
如下
image.png