亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2017年07月05日 10:50:10   作者:傲嬌的黃同學(xué)  
本篇文章主要介紹了用node和express連接mysql實(shí)現(xiàn)登錄注冊(cè)的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,有興趣的可以了解一下

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

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

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

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

var app = new express();

app.use(express.static('public')); //靜態(tài)資源的入口
app.use('/user',user);    //這樣寫(xiě)是為了以后如果改變了請(qǐng)求路徑,也不用改邏輯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)到首頁(yè)");
     setTimeout(function() {
      location.href='http://'+window.location.host+'/html/index.html';
     },3000)
    }else {
     alert('登錄名或密碼錯(cuò)誤')
    }
   }
  })  
 })


 $("#register").click(function(){
  $.ajax({
   url: "/user/register",
   type: 'post',
   data: $("#formRegister").serialize(),
   success: function(data) {
    console.log(data);
    if(data.status == 99999) {
     alert("注冊(cè)成功")
    }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){})

})

//注冊(cè)
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("已有此用戶(hù)名")
    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;

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

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

最后來(lái)個(gè)展望未來(lái)。

文章頁(yè)我打算用jade渲染整個(gè)文章html再返回出來(lái)。因?yàn)槲恼侣铮兊钠鋵?shí)也不多,而且用vue的話(huà),個(gè)人感覺(jué)像評(píng)論啊這種小組件用比較好,文章都是靜態(tài)的,所以先在后端渲染出來(lái)直接返回,還不用再請(qǐng)求一遍再渲染。

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Windows下安裝NodeJS的詳細(xì)步驟

    Windows下安裝NodeJS的詳細(xì)步驟

    這篇文章主要介紹了Windows下安裝NodeJS,本文分步驟通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • socket.io實(shí)現(xiàn)在線(xiàn)群聊功能

    socket.io實(shí)現(xiàn)在線(xiàn)群聊功能

    這篇文章主要為大家詳細(xì)介紹了socket.io實(shí)現(xiàn)在線(xiàn)群聊功能的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 使用Node.js實(shí)現(xiàn)一個(gè)簡(jiǎn)單的FastCGI服務(wù)器實(shí)例

    使用Node.js實(shí)現(xiàn)一個(gè)簡(jiǎn)單的FastCGI服務(wù)器實(shí)例

    這篇文章主要介紹了使用Node.js實(shí)現(xiàn)一個(gè)簡(jiǎn)單的FastCGI服務(wù)器實(shí)例,也可以作為一個(gè)比較詳細(xì)的Node.js服務(wù)器創(chuàng)建教程,需要的朋友可以參考下
    2014-06-06
  • nodejs body-parser 解析post數(shù)據(jù)實(shí)例

    nodejs body-parser 解析post數(shù)據(jù)實(shí)例

    下面小編就為大家?guī)?lái)一篇nodejs body-parser 解析post數(shù)據(jù)實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • Node如何后臺(tái)數(shù)據(jù)庫(kù)使用增刪改查功能

    Node如何后臺(tái)數(shù)據(jù)庫(kù)使用增刪改查功能

    這篇文章主要介紹了Node如何后臺(tái)數(shù)據(jù)庫(kù)使用增刪改查功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Node.js中require的工作原理淺析

    Node.js中require的工作原理淺析

    這篇文章主要介紹了Node.js中require的工作原理淺析,通過(guò)分析node.js的源碼得到本文,需要的朋友可以參考下
    2014-06-06
  • 深入解讀Node.js中的koa源碼

    深入解讀Node.js中的koa源碼

    這篇文章主要介紹了深入解讀Node.js中的koa源碼,任何一個(gè)框架的出現(xiàn)都是為了解決問(wèn)題,而Koa則是為了更方便的構(gòu)建http服務(wù)而出現(xiàn)的。 可以簡(jiǎn)單的理解為一個(gè)HTTP服務(wù)的中間件框架。,需要的朋友可以參考下
    2019-06-06
  • 基于豆瓣API+Angular開(kāi)發(fā)的web App

    基于豆瓣API+Angular開(kāi)發(fā)的web App

    這篇文章主要介紹了基于豆瓣API+Angular開(kāi)發(fā)的web App的方法和示例代碼,效果非常棒,有需要的小伙伴參考下
    2015-01-01
  • 使用puppeteer破解極驗(yàn)的滑動(dòng)驗(yàn)證碼

    使用puppeteer破解極驗(yàn)的滑動(dòng)驗(yàn)證碼

    這篇文章主要介紹了利用puppeteer破解極驗(yàn)的滑動(dòng)驗(yàn)證功能,基本流程代碼實(shí)現(xiàn)給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-02-02
  • package.json與package-lock.json創(chuàng)建及使用詳解

    package.json與package-lock.json創(chuàng)建及使用詳解

    這篇文章主要為大家介紹了package.json與package-lock.json創(chuàng)建及使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論