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命令行参数处理模块commander使用实例
Sep 17 NodeJs
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
Sep 26 NodeJs
Nodejs全栈框架StrongLoop推荐
Nov 09 NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
Nodejs 发送Post请求功能(发短信验证码例子)
Feb 09 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
nodejs socket服务端和客户端简单通信功能
Sep 14 NodeJs
深入理解NodeJS 多进程和集群
Oct 17 NodeJs
NodeJs 文件系统操作模块fs使用方法详解
Nov 26 NodeJs
NodeJS实现同步的方法
Mar 02 NodeJs
Nodejs实现微信分账的示例代码
Jan 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实现mysql同步的实现方法
2009/10/21 PHP
php中current、next与reset函数用法实例
2014/11/17 PHP
php设置页面超时时间解决方法
2015/09/22 PHP
漂亮的widgets,支持换肤和后期开发新皮肤
2007/04/23 Javascript
Prototype使用指南之selector.js说明
2008/10/26 Javascript
javascript dom 基本操作小结
2010/04/11 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
有效提高JavaScript执行效率的几点知识
2015/01/31 Javascript
快速掌握Node.js模块封装及使用
2016/03/21 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
javascript兼容性(实例讲解)
2017/08/15 Javascript
Vue 全局loading组件实例详解
2018/05/29 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
vue-cli —— 如何局部修改Element样式
2020/10/22 Javascript
Python中对列表排序实例
2015/01/04 Python
python 文件操作api(文件操作函数)
2016/08/28 Python
Python数据结构与算法之完全树与最小堆实例
2017/12/13 Python
详解Python 实现元胞自动机中的生命游戏(Game of life)
2018/01/27 Python
Python视频爬虫实现下载头条视频功能示例
2018/05/07 Python
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
python如何对链表操作
2020/10/10 Python
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
美国网上眼镜供应商:LEOTONY(眼镜、RX太阳镜和太阳镜)
2017/10/31 全球购物
ESDlife健康生活易:身体检查预订、搜寻及比较
2019/05/10 全球购物
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
大学生求职简历的自我评价范文
2013/10/12 职场文书
汽车机修工岗位职责
2014/03/06 职场文书
医院护士工作检讨书
2014/10/26 职场文书
详解TypeScript中的类型保护
2021/04/29 Javascript
MySQL时区造成时差问题
2022/04/13 MySQL
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js