国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

用node和express連接mysql實現(xiàn)登錄注冊的實現(xiàn)代碼

2019-11-19 16:10:04
字體:
供稿:網(wǎng)友

為了數(shù)據(jù)庫課設(shè),打算后臺用node搭建,前臺用vue搞個博客出來(因為前段時間在學(xué)啊)。本來node不想用框架,喜歡先打好基礎(chǔ)的,奈何3個星期要把他做完和應(yīng)付各種考試,所以最后還是用了express,大大簡化我的學(xué)習(xí)成本。

數(shù)據(jù)庫我選了比較“正式”的MySQL,代碼方面這個比MongoDB復(fù)雜一些。而且這是數(shù)據(jù)庫課設(shè),如果用mongodb老師肯定讓我掛了,因為沒有涉及到設(shè)置主鍵、外鍵等。

先在主入口js引入登錄注冊業(yè)務(wù)js和發(fā)起一個監(jiān)聽端口

var express = require('express');var user = require('./controll/user'); var app = new express();app.use(express.static('public')); //靜態(tài)資源的入口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秒后跳轉(zhuǎn)到首頁");     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("登錄名已經(jīng)有人用")    }   }  })   })

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();})//獲取sessionrouter.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;

代碼很多,不一一解釋了,如果以后有空再補(bǔ)回。先說幾個點

  1. 我把連接數(shù)據(jù)庫的邏輯都包在了select方法里。因為最后要把查詢到的結(jié)果返回回去,所以就要return,但是!!查詢數(shù)據(jù)庫是異步操作!!所以直接在select函數(shù)的最后一行return是沒有效果的,所以就算return都要在查完后的那個回掉函數(shù),但是在回掉函數(shù)return 的話是不能return到select函數(shù)外的。解決方案就是es6的Promise。詳細(xì)的就自己學(xué)相關(guān)知識了。
  2. 拿到查詢后的結(jié)果,登錄與注冊要分清楚邏輯,什么時候是成功的什么情況是失敗的。注冊這里我掉坑了。因為名不能重復(fù),所以要先查詢,如果能查到放回的是status=99999。剛開始我沒理解清楚Promise,以為查詢不成功就是走reject(err)其實并不是,查詢不成功返回的是[],執(zhí)行的還是resolve(),區(qū)分就只能看他返回來的status。
  3. 還有保存登錄狀態(tài),就是session,這里我也沒怎么弄懂。但是這一步可以放在router的中間件執(zhí)行,這樣每個經(jīng)過這個router就能執(zhí)行那一步了。如果存在req.session.user的時候,就把當(dāng)前的locals.user賦值。
  4. 導(dǎo)致我注冊那里摔了很久還爬不上來除了沒理解清楚Promise外,還有mysql不能輸入中文。當(dāng)時我沒有設(shè)utf8,所以一直報錯,走的是reject(err)。不只只把mysql的語言設(shè)置為utf8,還要注意navcicat新建屬性的時候的字符類型,不然字符沖突搞得不能插入語句成功。

最后來個展望未來。

文章頁我打算用jade渲染整個文章html再返回出來。因為文章嘛,要變的其實也不多,而且用vue的話,個人感覺像評論啊這種小組件用比較好,文章都是靜態(tài)的,所以先在后端渲染出來直接返回,還不用再請求一遍再渲染。

想了想進(jìn)度了能力,除了增刪改查文章,我覺得我的博客也只能有查看和評論文章的功能,不知道vue哪里能用。。。可能我也還沒很好的接觸和理解vue畢竟我才學(xué)到vur-router。應(yīng)該大的功能就是做一個簡潔版markdown吧

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 锦屏县| 阜阳市| 青州市| 盖州市| 南乐县| 高邑县| 崇明县| 蚌埠市| 辽宁省| 沾益县| 凉山| 长海县| 宣化县| 丹阳市| 西畴县| 临颍县| 贺兰县| 河南省| 沧源| 巴塘县| 铁岭县| 阳曲县| 义马市| 泊头市| 兰州市| 新余市| 读书| 龙井市| 白朗县| 桃园县| 盱眙县| 昌平区| 恩施市| 甘孜县| 忻州市| 阳西县| 奇台县| 临武县| 邵武市| 平阴县| 祁东县|