中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用node和express連接mysql實現登錄注冊

發布時間:2021-06-25 11:23:01 來源:億速云 閱讀:258 作者:小新 欄目:web開發

這篇文章將為大家詳細講解有關如何使用node和express連接mysql實現登錄注冊,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

數據庫我選了比較“正式”的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新建屬性的時候的字符類型,不然字符沖突搞得不能插入語句成功。

關于“如何使用node和express連接mysql實現登錄注冊”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吉隆县| 白玉县| 周口市| 仙游县| 长沙市| 余干县| 涟源市| 潜山县| 灌南县| 铁岭县| 迁安市| 海原县| 绥江县| 双鸭山市| 卢龙县| 措勤县| 海宁市| 吐鲁番市| 老河口市| 故城县| 中方县| 运城市| 济源市| 伊宁市| 兴安盟| 常宁市| 林芝县| 华蓥市| 陇西县| 奈曼旗| 原平市| 海兴县| 凤山市| 台南县| 景洪市| 清远市| 厦门市| 乡宁县| 康乐县| 宿迁市| 桐梓县|