用node和express连接mysql实现登录注册的实现代码


Posted in Javascript onJuly 05, 2017

为了数据库课设,打算后台用node搭建,前台用vue搞个博客出来(因为前段时间在学啊)。本来node不想用框架,喜欢先打好基础的,奈何3个星期要把他做完和应付各种考试,所以最后还是用了express,大大简化我的学习成本。

数据库我选了比较“正式”的MySQL,代码方面这个比MongoDB复杂一些。而且这是数据库课设,如果用mongodb老师肯定让我挂了,因为没有涉及到设置主键、外键等。

先在主入口js引入登录注册业务js和发起一个监听端口

var express = require('express');
var user = require('./controll/user'); 

var app = new express();

app.use(express.static('public')); //静态资源的入口
app.use('/user',user);    //这样写是为了以后如果改变了请求路径,也不用改逻辑js而是改这行的路径即可

var server = app.listen(3000)

html

$("#signup").click(function(){
  $.ajax({
   url: "/user/signup",
   type: 'post',
   data: $("#formid").serialize(),
   success: function(data) {
    if(data.status == 99999) {
     alert("3秒后跳转到首页");
     setTimeout(function() {
      location.href='http://'+window.location.host+'/html/index.html';
     },3000)
    }else {
     alert('登录名或密码错误')
    }
   }
  })  
 })


 $("#register").click(function(){
  $.ajax({
   url: "/user/register",
   type: 'post',
   data: $("#formRegister").serialize(),
   success: function(data) {
    console.log(data);
    if(data.status == 99999) {
     alert("注册成功")
    }else {
     alert("登录名已经有人用")
    }
   }
  })  
 })

user.js

var mysql = require('mysql');
var express = require('express');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var session = require('cookie-session');

function select(sql) {
 var promise = new Promise(function(resolve,reject) {
  var result = null;
  var mysql = require('mysql');
  var connection = mysql.createConnection({
   host: 'localhost',
   user: 'root',
   password: 'root'
  });

  connection.connect();
  connection.query("USE test");
  connection.query(sql, function (err, results, fields) { 
   if (err) { 
    console.log("err");
    reject(err); 
   }else {
    console.log("yes");
    if(results.length > 0) {
     resolve({status: 99999});
    }else {
     resolve({status: 00000});
    }   
   } 
   } 
  );
  connection.end(); 
 })

 return promise; 
}


var router = express.Router();
router.use(bodyParser.urlencoded({ extended: true }));
router.use(cookieParser())
router.use(session({
 secret: 'blog'
}))
router.use(function timeLog(req,res,next) {
 var _user = req.session.user;
 if(_user) {
  //router.locals.user = user;
 }
 next();
})

//登录
router.post('/signup',function(req, res) {
 var _user = req.body.user;
 var name = _user.name;
 var password = _user.password;
 select('SELECT * FROM name WHERE name = "'+ name + '" AND password = "' + password + '";').then(function(data) {
  //session存user name和userid
  req.session.user = name;
  data.status > 50 ? data.url = '/html/index.html' : null;
  res.json(data);
  res.end();
  req.redirect("/");
 }).catch(function(err){})

})

//注册
router.post('/register',function(req, res) {
 var _user = req.body.user;
 var name = _user.name;
 var password = _user.password;
 console.log(name+"  "+password)
 select('SELECT * FROM name WHERE name = "'+ name + '";')
  .then(function(data) {
   if(data.status == 99999) {
    console.log("已有此用户名")
    res.json({status:00000});
    res.end();
   }else {
    select('INSERT INTO name(name,password) VALUES ("'+name+'", "'+password+'");')
    .then(function(data) { 
     res.json({status:99999});
     res.end();
    }).catch(function(err){})
   }   
  }).catch(function(err){

  })

});

//退出
router.get("/logout",function(req, res) {
 delete req.session.user;
 res.end();
})

//获取session
router.get("/session",function(req, res) {
 console.log("user in session");
 console.log(req.session.user);
 res.json({user:req.session.user});
 res.end();
})

module.exports = router;

代码很多,不一一解释了,如果以后有空再补回。先说几个点

  1. 我把连接数据库的逻辑都包在了select方法里。因为最后要把查询到的结果返回回去,所以就要return,但是!!查询数据库是异步操作!!所以直接在select函数的最后一行return是没有效果的,所以就算return都要在查完后的那个回掉函数,但是在回掉函数return 的话是不能return到select函数外的。解决方案就是es6的Promise。详细的就自己学相关知识了。
  2. 拿到查询后的结果,登录与注册要分清楚逻辑,什么时候是成功的什么情况是失败的。注册这里我掉坑了。因为名不能重复,所以要先查询,如果能查到放回的是status=99999。刚开始我没理解清楚Promise,以为查询不成功就是走reject(err)其实并不是,查询不成功返回的是[],执行的还是resolve(),区分就只能看他返回来的status。
  3. 还有保存登录状态,就是session,这里我也没怎么弄懂。但是这一步可以放在router的中间件执行,这样每个经过这个router就能执行那一步了。如果存在req.session.user的时候,就把当前的locals.user赋值。
  4. 导致我注册那里摔了很久还爬不上来除了没理解清楚Promise外,还有mysql不能输入中文。当时我没有设utf8,所以一直报错,走的是reject(err)。不只只把mysql的语言设置为utf8,还要注意navcicat新建属性的时候的字符类型,不然字符冲突搞得不能插入语句成功。

最后来个展望未来。

文章页我打算用jade渲染整个文章html再返回出来。因为文章嘛,要变的其实也不多,而且用vue的话,个人感觉像评论啊这种小组件用比较好,文章都是静态的,所以先在后端渲染出来直接返回,还不用再请求一遍再渲染。

想了想进度了能力,除了增删改查文章,我觉得我的博客也只能有查看和评论文章的功能,不知道vue哪里能用。。。可能我也还没很好的接触和理解vue毕竟我才学到vur-router。应该大的功能就是做一个简洁版markdown吧

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 表单验证扩展代码(二)
Oct 20 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
Feb 05 Javascript
Jquery动态进行图片缩略的原理及实现
Aug 13 Javascript
js substring从右边获取指定长度字符串(示例代码)
Dec 23 Javascript
JS过滤url参数特殊字符的实现方法
Dec 24 Javascript
jQuery使用height()获取高度需要注意的地方
Dec 13 Javascript
使用JavaScript链式编程实现模拟Jquery函数
Dec 21 Javascript
javascript实现类似超链接的效果
Dec 26 Javascript
完美实现仿QQ空间评论回复特效
May 06 Javascript
详解vue-cli构建项目反向代理配置
Sep 07 Javascript
总结js中的一些兼容性易错的问题
Dec 18 Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
Jan 17 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
Jul 05 #Javascript
jQuery使用ajax_动力节点Java学院整理
Jul 05 #jQuery
jQuery扩展_动力节点Java学院整理
Jul 05 #jQuery
jQuery选择器_动力节点Java学院整理
Jul 05 #jQuery
jQuery事件_动力节点Java学院整理
Jul 05 #jQuery
jQuery修改DOM结构_动力节点Java学院整理
Jul 05 #jQuery
详解vue express启动数据服务
Jul 05 #Javascript
You might like
PHP脚本数据库功能详解(下)
2006/10/09 PHP
javascript,php获取函数参数对象的代码
2011/02/03 PHP
php获取文件大小的方法
2014/02/26 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
php使用file函数、fseek函数读取大文件效率对比分析
2016/11/04 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
关于js datetime的那点事
2011/11/15 Javascript
javascript实现获取字符串hash值
2015/05/10 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
用jQuery实现圆点图片轮播效果
2017/03/19 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
在vue中使用echarts图表实例代码详解
2018/10/22 Javascript
如何使用pm2快速将项目部署到远程服务器
2019/03/12 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
[36:16]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.19
2020/12/24 DOTA
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
python实现FTP服务器服务的方法
2017/04/11 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
Python和Sublime整合过程图示
2019/12/25 Python
Python网络爬虫四大选择器用法原理总结
2020/06/01 Python
Python-openCV开运算实例
2020/07/05 Python
python爬取网易云音乐热歌榜实例代码
2020/08/07 Python
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
服装店营销方案
2014/03/10 职场文书
党的群众路线教育实践活动整改落实情况自查报告
2014/10/28 职场文书
经费申请报告
2015/05/15 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
分享几个简单MySQL优化小妙招
2022/03/31 MySQL