node中如何用最簡單的方法實現(xiàn)注冊登錄

創(chuàng)建數(shù)據(jù)庫

  • 首先我們創(chuàng)建一個數(shù)據(jù)庫,這里我們表名寫個1688
  • 之后我們創(chuàng)建了一個用戶表user
  • 設計表結構如下:


    用戶表結構

創(chuàng)建服務端

  • 我們先創(chuàng)建一個最簡單的服務,設置端口號4002潮针,地址10.20.159.170
var http = require("http");
var querystring = require("querystring");
var server = http.createServer(createHandler);
var data, req, res;
server.listen("4002", "10.20.159.170", function () {
    console.log("開啟成功")
})
function createHandler(_req, _res) {
    req = _req;
    res = _res;
    req.on("data", dataHandler);
    req.on("end", endHandler);
}
function dataHandler() {
    
}
function endHandler() {
    
}

這樣我們的一個最簡單的服務就搭建完畢了

  • 之后我們還需要對這個服務進行一下改進,對數(shù)據(jù)進行一下處理。
    • 我們的dataHandler會處理post請求發(fā)來的信息,這是一個buffer格式蒲每,我們需要對他進行第一步的處理 ,轉換成字符喻括,存儲在data變量里邀杏。
    • 我們還要在endHandler中,設置一下響應頭唬血,解決亂碼的問題
res.writeHead(200, {
        "content-type": "text/html;charset=utf-8",
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Headers": "*"
    });
  • 之后我們對各種請求進行處理
    • 我們對發(fā)送過來的4002/之后的數(shù)據(jù)進行處理望蜡。會發(fā)送過來一個?加數(shù)據(jù)拷恨,我們把他處理成不帶脖律?的字符串.例如?login 處理成login
var type = req.url.indexOf("?") > -1 ? req.url.split("?")[0] : req.url;
type = type.slice(1);
  • 然后我們判斷請求類型對不同的請求類型的數(shù)據(jù)進行不同的處理
if (req.method.toLowerCase() === "get") {
        if (req.url.indexOf("?") > -1) {
            obj = querystring.parse(req.url.split("?")[1]);
        }
    } else if (req.method.toLowerCase() === "post") {
        try {
            obj = JSON.parse(data);
        } catch (e) {
            obj = querystring.parse(data);
        }
    } else {
        res.end();
        return;
    }

到這里我們的數(shù)據(jù)處理就全部完成。

連接數(shù)據(jù)庫

  • 首先我們要在當前服務所在文件夾下面打開cmd命令符
    使用npm i mysqlcnpm i mysql腕侄。
    之后我們在創(chuàng)建好的服務中添加
// 引入mysql模塊
var sql = require("mysql");
// 創(chuàng)建一個連接數(shù)據(jù)庫
var db = sql.createConnection({
    url: "localhost",     // 代表本地地址
    port: 3306,          //端口號
    user: "root",        // 用戶名
    password: "root",      // 密碼
    database: "1688"      // 要使用的數(shù)據(jù)庫
});
// 連接數(shù)據(jù)庫
db.connect(function (err) {
    if (err) {
        console.log("連接失敗");
        return;
    } else {
        console.log("連接成功");
    }
})
  • 我們開啟服務状您,就會看到顯示數(shù)據(jù)庫連接成功。
數(shù)據(jù)庫連接成功

之后我們可以就可以進行數(shù)據(jù)庫操作了兜挨。需要值得注意的是,數(shù)據(jù)庫的查詢操作是一個異步操作眯分,所以我們使用了函數(shù)套函數(shù)的操作來避免異步拌汇。

// 數(shù)據(jù)查詢
function sql_select(table,res1,callback) {
    var sql = "select * from "+table;
    db.query(sql, function (err, results) {
        if(callback){
            callback(results,res1);
            return;
        }
        res1.write(JSON.stringify(results));
        res1.end()
    })

}
// 數(shù)據(jù)庫插入
function sql_insert(name, account, password) {
    let sql = "INSERT INTO `user`(`name`, `account`, `password`) VALUES (?,?,?)";
    db.query(sql, [name, account, password], function (error, res) {
        console.log(res);
    })
}

注意這里的數(shù)據(jù)插入操作要和你的數(shù)據(jù)庫進行對應

  • 之后我們switch來判斷要進行的操作,和數(shù)據(jù)庫進行對比弊决,然后返回信息和操作噪舀。
  • 這里給出我們的接口文檔
url : http://10.20.159.170:4002
method : post
type :json

1. 注冊
    url : http://http://10.20.159.170:4002/registe
    req : {
        name : 用戶名
        account:    手機號
        password :     密碼
    }
    res : "成功"
2. 登錄
url : http://http://10.20.159.170:4002/login
req : {
    account:    手機號
    password :     密碼
}
res : {
    name : 用戶名
}
  • 同樣是需要和數(shù)據(jù)庫一樣的,這里給出我們的完整服務端的代碼
var http = require("http");
var querystring = require("querystring");
var sql = require("mysql");
var data, req, res;
var db = sql.createConnection({
    url: "localhost",
    port: 3306,
    user: "root",
    password: "root",
    database: "1688"
});
db.connect(function (err) {
    if (err) {
        console.log("連接失敗");
        return;
    } else {
        console.log("連接成功");
    }
})
// sql_select();
// 數(shù)據(jù)查詢
function sql_select(table,res1,callback) {
    var sql = "select * from "+table;
    db.query(sql, function (err, results) {
        if(callback){
            callback(results,res1);
            return;
        }
        res1.write(JSON.stringify(results));
        res1.end()
    })

}
// 數(shù)據(jù)庫插入
function sql_insert(name, account, password) {
    let sql = "INSERT INTO `user`(`name`, `account`, `password`) VALUES (?,?,?)";
    db.query(sql, [name, account, password], function (error, res) {
        console.log(res);
    })
}
var server = http.createServer(createHandler);
server.listen("4002", "10.20.159.170", function () {
    console.log("開啟成功")
})


function createHandler(_req, _res) {
    req = _req;
    res = _res;
    req.on("data", dataHandler);
    req.on("end", endHandler);
}

function dataHandler(_data) {
    data = String(_data);
}
function endHandler() {
    res.writeHead(200, {
        "content-type": "text/html;charset=utf-8",
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Headers": "*"
    });
    var obj;
    var type = req.url.indexOf("?") > -1 ? req.url.split("?")[0] : req.url;
    type = type.slice(1);
    if (req.method.toLowerCase() === "get") {
        if (req.url.indexOf("?") > -1) {
            obj = querystring.parse(req.url.split("?")[1]);
        }
    } else if (req.method.toLowerCase() === "post") {
        try {
            obj = JSON.parse(data);
        } catch (e) {
            obj = querystring.parse(data);
        }
    } else {
        res.end();
        return;
    }
    switch (type){
        case "login":
            sql_select("user",res,function(results,res1){   
                var a;
                results.forEach(function(item){
                    if(item.password === obj.password && item.account === obj.account ){
                        a ={}
                        a.name = item.name;
                    }
                });
                if(a){
                    res1.write(JSON.stringify(a));
                    res1.end();
                    return;
                }
                // res1.write();
                res1.end("賬號或密碼錯誤");
                
            })
            return;
        case "registe":
            sql_select("user",res,function(results,res1){
                var flag = results.some(function(item){
                    return item.account === obj.account
                })
                if(flag){
                    res1.write("該賬戶已被注冊");
                    res1.end();
                    return
                }
                sql_insert(obj.name, obj.account, obj.password);
                res1.write("數(shù)據(jù)插入成功魁淳,點擊跳轉");
                res1.end();
            })
    }
}

前端代碼

注冊部分

  • 參考我們的接口文檔,注冊需要發(fā)送一個對象形式的与倡,帶有name,account,password的對象界逛。
    所以我們簡單的創(chuàng)建了一個from并且有3個input
 <form>
        <label for="name">name</label>
        <input type="text" id="name">
        <label for="account">name</label>
        <input type="text" id="account">
        <label for="password">name</label>
        <input type="text" id="password">
        <button>注冊</button>
    </form>
  • js
  • 首先我們先阻止表單的默認事件
  • 之后我們點擊提交時,按照我們的接口文檔來創(chuàng)建對象纺座。
  • 提交到服務器中息拜,服務器就會自動處理


    插入數(shù)據(jù)
插入數(shù)據(jù)成功
var inputs,btn,form
    init();
    function init(){
        form = document.querySelector("form")
        inputs = document.querySelectorAll("input")
        btn = document.querySelector("button");
        form.addEventListener("submit",submitHandler);
        btn.addEventListener("click",clickHandler)
    }
    function submitHandler(e){
        e.preventDefault()
    }
    function clickHandler(){
        var data = {
            name : inputs[0].value,
            account : inputs[1].value,
            password : inputs[2].value,
        }
        ajax(data);
    }
    function ajax(data){
        var xhr = new XMLHttpRequest();
        xhr.addEventListener("load",loadHadler);
        xhr.open("POST","http://10.20.159.170:4002/registe");
        xhr.send(JSON.stringify(data))
    }
    function loadHadler(e){
        console.log(e.currentTarget.response)
    }

登錄部分

  • 同樣參考接口文檔,簡單的創(chuàng)建一個form表單
<form>
        <label for="account">account</label>
        <input type="text" id="account">
        <label for="password">password</label>
        <input type="text" id="password">
        <button>登錄</button>
    </form>
  • js
  • 首先我們先阻止表單的默認事件
  • 之后我們點擊提交時净响,按照我們的接口文檔來創(chuàng)建對象少欺。
  • 提交到服務器中,服務器就會自動處理,我們把接收的數(shù)據(jù)進行一些處理馋贤。
    • 如果傳回來一個對象代表赞别,登錄成功,我們就創(chuàng)建一個session來模擬我們的登錄狀態(tài)配乓,然后跳轉仿滔。
    • 如果傳來一個字符串,我們就直接輸出密碼錯誤


      登錄成功

      登錄失敗
  • js
var inputs, btn, form
        init();
        function init() {
            form = document.querySelector("form")
            inputs = document.querySelectorAll("input")
            btn = document.querySelector("button");
            form.addEventListener("submit", submitHandler);
            btn.addEventListener("click", clickHandler)
        }
        function submitHandler(e) {
            e.preventDefault()
        }
        function clickHandler() {
            var data = {
                account: inputs[0].value,
                password: inputs[1].value,
            }
            ajax(data);
        }
        function ajax(data) {
            var xhr = new XMLHttpRequest();
            xhr.addEventListener("load", loadHadler);
            xhr.open("POST", "http://10.20.159.170:4002/login");
            xhr.send(JSON.stringify(data))
        }
        function loadHadler(e) {
            try {
                var a = JSON.parse(e.currentTarget.response);
                sessionStorage.name = a.name;
                location.href = "./index.html"
            } catch {
                alert("賬戶或密碼錯誤");
            }
        }
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末犹芹,一起剝皮案震驚了整個濱河市崎页,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌羽莺,老刑警劉巖实昨,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異盐固,居然都是意外死亡荒给,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門刁卜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來志电,“玉大人,你說我怎么就攤上這事蛔趴√袅荆” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵孝情,是天一觀的道長鱼蝉。 經(jīng)常有香客問我,道長箫荡,這世上最難降的妖魔是什么魁亦? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮羔挡,結果婚禮上洁奈,老公的妹妹穿的比我還像新娘间唉。我一直安慰自己,他們只是感情好利术,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布呈野。 她就那樣靜靜地躺著,像睡著了一般印叁。 火紅的嫁衣襯著肌膚如雪被冒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天喉钢,我揣著相機與錄音姆打,去河邊找鬼。 笑死肠虽,一個胖子當著我的面吹牛幔戏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播税课,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼闲延,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了韩玩?” 一聲冷哼從身側響起垒玲,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎找颓,沒想到半個月后合愈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡击狮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年佛析,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彪蓬。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡寸莫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出档冬,到底是詐尸還是另有隱情膘茎,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布酷誓,位于F島的核電站披坏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏盐数。R本人自食惡果不足惜刮萌,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娘扩。 院中可真熱鬧着茸,春花似錦、人聲如沸琐旁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灰殴。三九已至敬特,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牺陶,已是汗流浹背伟阔。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掰伸,地道東北人皱炉。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像狮鸭,于是被迫代替她去往敵國和親合搅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348