nodejs同步调用获取mysql数据时遇到的大坑


Posted in NodeJs onMarch 02, 2019

mysql调用获取数据,只能是异步方式返回结果,不能同步获取结果,因此,须在回调函数中编写处理事件。期间看了下Aysnc.js,是用于多个要返回回调函数的事件,将这些事件有序的组织起来,最后只返回一个回调函数,并没有改变异步的本质,而是将多个异步整合为一个异步,从而满足写程序的需求。

错误示范

获取数据库中的数据函数

var _getUser = function(name) {
  var sql = "SELECT * FROM " + TABLE + " WHERE user_loginname='" + name + "'";
  connection.query(sql, function(err, results) {
    if(!err) {
      var res = hasUser(results);
      return res;
    }else {
      return error();
    }
  });
  function hasUser(results) {
    if(results.length == 0) {
      return {err: 1, msg: "此用户名不存在"};
    }
    else {
      return results[0];
    }
  }
  function error() {
    return {err: 1, msg: "数据库出错"};
  }
}
var getUser = function(name){
  return _getUser(name);
}

获取结果处理事件

//获取post上来的 data数据中 uname的值
var uname = req.body.uname; 
var User = getUser(uname);
if(User.err){
   res.status(404)
 } else {
  var upwd = md5 (req.body.upwd);
  //查询到匹配用户名的信息,但相应的password属性不匹配
  if(upwd != User.user_passwd){  
     req.session.error = "密码错误";
     res.send(404);
     // res.redirect("/login");
   }else{ 
     //信息匹配成功,则将此对象(匹配到的user) 赋给session.user 并返回成功                  
     req.session.user = {name: uname, password: upwd};
     res.status(200).send("success")
     // res.send(200);
     // res.redirect("/home");
   }
 }
// md5方式加密
function md5 (text) {
  return crypto.createHash('md5').update(text).digest('hex');
};

正确示范

获取数据库中的数据函数

var _getUser = function(name, callback) {
  var sql = "SELECT * FROM " + TABLE + " WHERE user_loginname='" + name + "'";
  connection.query(sql, function(err, results) {
    if(!err) {
      var res = hasUser(results)
      callback(res);
    }else {
      callback(error());
    }
  });
  function hasUser(results) {
    if(results.length == 0) {
      return {err: 1, msg: "此用户名不存在"};
    }
    else {
      return results[0];
    }
  }
  function error() {
    return {err: 1, msg: "数据库出错"};
  }
}
var getUser = function(name, callback){
  return _getUser(name, callback);
}

获取结果处理事件

//获取post上来的 data数据中 uname的值
var uname = req.body.uname; 
getUser(uname, function(data){
  var User = data;
  if(User.err){
    res.status(404)
  } else {
    var upwd = md5 (req.body.upwd);
    //查询到匹配用户名的信息,但相应的password属性不匹配
    if(upwd != User.user_passwd){  
      req.session.error = "密码错误";
      res.send(404);
      // res.redirect("/login");
    }else{ 
      //信息匹配成功,则将此对象(匹配到的user) 赋给session.user 并返回成功                  
      req.session.user = {name: uname, password: upwd};
      res.status(200).send("success")
      // res.send(200);
      // res.redirect("/home");
    }
  }
});
// md5方式加密
function md5 (text) {
  return crypto.createHash('md5').update(text).digest('hex');
};

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

NodeJs 相关文章推荐
NodeJS中的MongoDB快速入门详细教程
Nov 11 NodeJs
nodejs中使用HTTP分块响应和定时器示例代码
Mar 19 NodeJs
NodeJs测试框架Mocha的安装与使用
Mar 28 NodeJs
nodejs批量下载图片的实现方法
May 19 NodeJs
Windows下快速搭建NodeJS本地服务器的步骤
Aug 09 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
nodejs 日志模块winston的使用方法
May 02 NodeJs
nodejs初始化init的示例代码
Oct 10 NodeJs
nodejs中实现修改用户路由功能
May 24 NodeJs
Nodejs实现WebSocket代码实例
May 19 NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 #NodeJs
Nodejs让异步变成同步的方法
Mar 02 #NodeJs
nodejs使用async模块同步执行的方法
Mar 02 #NodeJs
NodeJS实现同步的方法
Mar 02 #NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 #NodeJs
Nodejs对postgresql基本操作的封装方法
Feb 20 #NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 #NodeJs
You might like
php防攻击代码升级版
2010/12/29 PHP
PHP把网页保存为word文件的三种方法
2014/04/01 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
PHP面向对象详解(三)
2015/12/07 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
2016/09/01 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
React Component存在的几种形式详解
2018/11/06 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
微信小程序swiper左右扩展各显示一半代码实例
2019/12/05 Javascript
如何通过Proxy实现JSBridge模块化封装
2020/10/22 Javascript
jQuery实现本地存储
2020/12/22 jQuery
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
[36:17]DOTA2上海特级锦标赛 - VGL音乐会全集
2016/03/06 DOTA
python multiprocessing模块用法及原理介绍
2019/08/20 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
Vrbo英国:预订度假屋
2020/08/19 全球购物
上班睡觉检讨书
2014/01/09 职场文书
应用数学专业求职信
2014/03/14 职场文书
交通工程专业推荐信
2014/09/06 职场文书
高考1977观后感
2015/06/04 职场文书
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js