用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 相关文章推荐
javascript div 遮罩层封锁整个页面
Jul 10 Javascript
document.createElement()用法
Mar 13 Javascript
jQuery之尺寸调整组件的深入解析
Jun 19 Javascript
超简单JS二级、多级联动的简单实例
Feb 18 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
Aug 24 Javascript
JavaScript中 ES6 generator数据类型详解
Aug 11 Javascript
用jQuery实现优酷首页轮播图
Jan 09 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
Apr 28 jQuery
JS去掉字符串前后空格、阻止表单提交的实现代码
Jun 08 Javascript
Node.js实现连接mysql数据库功能示例
Sep 15 Javascript
基于JavaScript实现每日签到打卡轨迹功能
Nov 29 Javascript
js实现二级联动简单实例
Jan 11 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/11/26 PHP
php下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
PHP中mysql_field_type()函数用法
2014/11/24 PHP
phpmyadmin提示The mbstring extension is missing的解决方法
2014/12/17 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
2015/02/12 PHP
一个对于Array的简单扩展
2006/10/03 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
js动态生成指定行数的表格
2013/07/11 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
你不知道的高性能JAVASCRIPT
2016/01/18 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
CSS+jQuery实现简单的折叠菜单
2016/12/20 Javascript
javascript实现获取一个日期段内每天不同的价格(计算入住总价格)
2018/02/05 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
2019/05/14 jQuery
微信小程序文章详情页跳转案例详解
2019/07/09 Javascript
微信小程序入门之绘制时钟
2020/10/22 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
Python3基于sax解析xml操作示例
2018/05/22 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
在tensorflow中实现去除不足一个batch的数据
2020/01/20 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
解释i节点在文件系统中的作用
2013/11/26 面试题
实习护理工作自我评价
2013/09/25 职场文书
标准导师推荐信(医学类)
2013/10/28 职场文书
2014年大班保育员工作总结
2014/12/02 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
建房合同协议书
2016/03/21 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle