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教程之入门
Nov 21 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
mac下的nodejs环境安装的步骤
May 24 NodeJs
nodejs动态创建二维码的方法
Aug 12 NodeJs
nodejs结合Socket.IO实现的即时通讯功能详解
Jan 12 NodeJs
nodejs多版本管理总结
Apr 03 NodeJs
nodejs实现获取本地文件夹下图片信息功能示例
Jun 22 NodeJs
Nodejs libuv运行原理详解
Aug 21 NodeJs
nodejs中使用archive压缩文件的实现代码
Nov 26 NodeJs
详解nodejs内置模块
May 06 NodeJs
NodeJs内存占用过高的排查实战记录
May 10 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中的字符编码转换函数用法示例
2014/10/20 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
javascript实现的动态文字变换
2007/07/28 Javascript
JavaScript经典效果集锦
2010/07/06 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
在网站上应该用的30个jQuery插件整理
2011/11/03 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
javascript中对变量类型的判断方法
2015/08/09 Javascript
JavaScript事件 "事件对象"的注意要点
2016/01/14 Javascript
浅析使用BootStrap TreeView插件实现灵活配置快递模板
2016/11/28 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
EasyUI Tree树组件无限循环的解决方法
2017/09/27 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
JS实现基于拖拽改变物体大小的方法
2018/01/23 Javascript
详解如何创建并发布一个 vue 组件
2018/11/08 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
Javascript操作select控件代码实例
2020/02/14 Javascript
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
Python装饰器的函数式编程详解
2015/02/27 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
2020/04/22 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
TensorFlow2.0使用keras训练模型的实现
2021/02/20 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
Sephora丝芙兰澳洲官方网站:国际知名化妆品购物
2016/10/27 全球购物
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
植村秀美国官网:Shu Uemura美国
2019/03/19 全球购物
三年大学生活自我鉴定
2014/01/21 职场文书
实训报告范文大全
2014/11/04 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
vue3中的组件间通信
2021/03/31 Vue.js
Python帮你解决手机qq微信内存占用太多问题
2022/02/15 Python