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

之前本来想用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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,527评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,314评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,535评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,006评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,961评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,220评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,664评论 3 392
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,351评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,481评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,397评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,443评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,123评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,713评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,801评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,010评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,494评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,075评论 2 341

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,051评论 0 3
  • # Ajax标签(空格分隔): 笔记整理---[TOC]### 从输入网址开始:- 在学习ajax之前,你应该先了...
    V8阅读 248评论 1 0
  • ## 框架和库的区别?> 框架(framework):一套完整的软件设计架构和**解决方案**。> > 库(lib...
    Rui_bdad阅读 2,885评论 1 4
  • 面试题一:https://github.com/jimuyouyou/node-interview-questio...
    R_X阅读 1,609评论 0 5
  • 一、Node快速体验 1、 Node介绍 (1) Node.js是什么 Node 是一个基于Chrome V8 ...
    宠辱不惊丶岁月静好阅读 3,280评论 0 6