用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 相关文章推荐
用JS实现一个页面多个css样式实现
May 29 Javascript
jquery图片不完全按比例自动缩小的简单代码
Jul 29 Javascript
Js获取下拉框选定项的值和文本的实现代码
Feb 26 Javascript
jQuery Mobile 和 Kendo UI 的比较
May 05 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
Jun 05 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
Jan 04 Javascript
Angular.JS利用ng-disabled属性和ng-model实现禁用button效果
Apr 05 Javascript
基于cropper.js封装vue实现在线图片裁剪组件功能
Mar 01 Javascript
JS关于刷新页面的相关总结
May 09 Javascript
使用RN Animated做一个“添加购物车”动画的方法
Sep 12 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
Sep 21 Javascript
分享一款超好用的JavaScript 打包压缩工具
Apr 26 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
咖啡的种类和口感
2021/03/03 新手入门
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
Yii2框架操作数据库的方法分析【以mysql为例】
2019/05/27 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
动态添加js事件实现代码
2009/03/12 Javascript
ASP.NET中使用后端代码注册脚本 生成JQUERY-EASYUI的界面错位的解决方法
2010/06/12 Javascript
javascript代码编写需要注意的7个小细节小结
2011/09/21 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
JQuery限制复选框checkbox可选中个数的方法
2015/04/20 Javascript
jQuery插件Timelinr 实现时间轴特效
2015/10/04 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
angularjs实现天气预报功能
2020/06/16 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
JavaScript 判断对象中是否有某属性的常用方法
2018/06/14 Javascript
js实现多张图片每隔一秒切换一张图片
2019/07/29 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
python 布尔操作实现代码
2013/03/23 Python
python非递归全排列实现方法
2017/04/10 Python
python 在屏幕上逐字显示一行字的实例
2018/12/24 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
学习Python需要哪些工具
2020/09/04 Python
利用CSS3实现单选框动画特效示例代码
2016/09/26 HTML / CSS
高一地理教学反思
2014/01/18 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
学校消防安全责任书
2014/07/23 职场文书
2014年教师节座谈会发言稿
2014/09/10 职场文书
工作疏忽、懈怠的检讨书
2014/09/11 职场文书
在校学生证明格式
2015/06/24 职场文书
销售口号霸气押韵
2015/12/24 职场文书
OpenCV-Python实现人脸美白算法的实例
2021/06/11 Python