用node和express连接mysql实现登录注册的实现代码
为了数据库课设,打算后台用node搭建,前台用vue搞个博客出来(因为前段时间在学啊)。本来node不想用框架,喜欢先打好基础的,奈何3个星期要把他做完和应付各种考试,所以最后还是用了express,大大简化我的学习成本。
数据库我选了比较“正式”的MySQL,代码方面这个比MongoDB复杂一些。而且这是数据库课设,如果用mongodb老师肯定让我挂了,因为没有涉及到设置主键、外键等。
先在主入口js引入登录注册业务js和发起一个监听端口
varexpress=require('express'); varuser=require('./controll/user'); varapp=newexpress(); app.use(express.static('public'));//静态资源的入口 app.use('/user',user);//这样写是为了以后如果改变了请求路径,也不用改逻辑js而是改这行的路径即可 varserver=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
varmysql=require('mysql'); varexpress=require('express'); varbodyParser=require('body-parser'); varcookieParser=require('cookie-parser'); varsession=require('cookie-session'); functionselect(sql){ varpromise=newPromise(function(resolve,reject){ varresult=null; varmysql=require('mysql'); varconnection=mysql.createConnection({ host:'localhost', user:'root', password:'root' }); connection.connect(); connection.query("USEtest"); 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(); }) returnpromise; } varrouter=express.Router(); router.use(bodyParser.urlencoded({extended:true})); router.use(cookieParser()) router.use(session({ secret:'blog' })) router.use(functiontimeLog(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; varname=_user.name; varpassword=_user.password; select('SELECT*FROMnameWHEREname="'+name+'"ANDpassword="'+password+'";').then(function(data){ //session存username和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; varname=_user.name; varpassword=_user.password; console.log(name+""+password) select('SELECT*FROMnameWHEREname="'+name+'";') .then(function(data){ if(data.status==99999){ console.log("已有此用户名") res.json({status:00000}); res.end(); }else{ select('INSERTINTOname(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){ deletereq.session.user; res.end(); }) //获取session router.get("/session",function(req,res){ console.log("userinsession"); console.log(req.session.user); res.json({user:req.session.user}); res.end(); }) module.exports=router;
代码很多,不一一解释了,如果以后有空再补回。先说几个点
- 我把连接数据库的逻辑都包在了select方法里。因为最后要把查询到的结果返回回去,所以就要return,但是!!查询数据库是异步操作!!所以直接在select函数的最后一行return是没有效果的,所以就算return都要在查完后的那个回掉函数,但是在回掉函数return的话是不能return到select函数外的。解决方案就是es6的Promise。详细的就自己学相关知识了。
- 拿到查询后的结果,登录与注册要分清楚逻辑,什么时候是成功的什么情况是失败的。注册这里我掉坑了。因为名不能重复,所以要先查询,如果能查到放回的是status=99999。刚开始我没理解清楚Promise,以为查询不成功就是走reject(err)其实并不是,查询不成功返回的是[],执行的还是resolve(),区分就只能看他返回来的status。
- 还有保存登录状态,就是session,这里我也没怎么弄懂。但是这一步可以放在router的中间件执行,这样每个经过这个router就能执行那一步了。如果存在req.session.user的时候,就把当前的locals.user赋值。
- 导致我注册那里摔了很久还爬不上来除了没理解清楚Promise外,还有mysql不能输入中文。当时我没有设utf8,所以一直报错,走的是reject(err)。不只只把mysql的语言设置为utf8,还要注意navcicat新建属性的时候的字符类型,不然字符冲突搞得不能插入语句成功。
最后来个展望未来。
文章页我打算用jade渲染整个文章html再返回出来。因为文章嘛,要变的其实也不多,而且用vue的话,个人感觉像评论啊这种小组件用比较好,文章都是静态的,所以先在后端渲染出来直接返回,还不用再请求一遍再渲染。
想了想进度了能力,除了增删改查文章,我觉得我的博客也只能有查看和评论文章的功能,不知道vue哪里能用。。。可能我也还没很好的接触和理解vue毕竟我才学到vur-router。应该大的功能就是做一个简洁版markdown吧
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。