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教程 安装express及配置app.js文件的详细步骤
May 11 NodeJs
nodejs中使用monk访问mongodb
Jul 06 NodeJs
Nodejs中解决cluster模块的多进程如何共享数据问题
Nov 10 NodeJs
详解nodejs微信公众号开发——6.自定义菜单
Apr 13 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
对mac下nodejs 更新到最新版本的最新方法(推荐)
May 17 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 NodeJs
nodejs中使用archive压缩文件的实现代码
Nov 26 NodeJs
nodeJs的安装与npm全局环境变量的配置详解
Jan 06 NodeJs
详解NodeJS模块化
Jun 15 NodeJs
NodeJs使用webpack打包项目的方法详解
Feb 28 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/07/24 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
PHP如何获取Cookie并实现模拟登录
2020/07/16 PHP
javascript下查找父节点的简单方法
2007/08/13 Javascript
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
JavaScript 题型问答有答案参考
2010/02/17 Javascript
javascript 函数参数限制说明
2010/11/19 Javascript
深入分析Cookie的安全性问题
2015/03/01 Javascript
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
Fullpage.js固定导航栏-实现定位导航栏
2016/03/17 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
浅谈js中对象的使用
2016/08/11 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
JavaScript 禁止用户保存图片的实现代码
2020/04/28 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
python实现从ftp服务器下载文件的方法
2015/04/30 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
python 实现数字字符串左侧补零的方法
2018/12/04 Python
python PrettyTable模块的安装与简单应用
2019/01/11 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
利用python 下载bilibili视频
2020/11/13 Python
css3使网页、图片变成灰色兼容大多数浏览器
2014/07/02 HTML / CSS
美国女孩服装购物网站:Justice
2017/03/04 全球购物
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
智乐游戏测试笔试题
2014/05/21 面试题
大学生个人总结的自我评价
2013/10/05 职场文书
银行委托书范本
2014/04/04 职场文书
2015年保卫科工作总结
2015/05/14 职场文书
社区干部培训心得体会
2016/01/06 职场文书
员工试用期工作总结
2019/06/20 职场文书
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android