內容:css
1.node鏈接數據庫html
2.數據庫經常使用操做前端
3.數據庫實例 - 用戶註冊、登錄node
1.node鏈接數據庫mysql
(1)下載mysql模塊jquery
(2)使用mysql模塊鏈接數據庫ajax
let db=mysql.createConnection({host, port, user, password, database});sql
這樣鏈接也有缺陷:鏈接會一直佔着數據庫,別的沒法在此鏈接結束以前鏈接數據庫,對於此咱們能夠使用鏈接池:數據庫
1 // 鏈接池 2 let db = mysql.createPool(配置)
實例:json
1 const mysql = require('mysql') 2 3 // 普通鏈接 4 // let db = mysql.createConnection({host: 'localhost', user: 'root', password: 'root', port: 3306, database: 'node'}) 5 // 鏈接池 6 let db = mysql.createPool({host: 'localhost', user: 'root', password: 'root', port: 3306, database: 'node'})
2.數據庫經常使用操做
(1)node的mysql數據庫操做
db.query(sql, (err, data)=>{});
1 db.query(`INSERT INTO user_table (ID, name, gender, chinese, math, english) VALUES(0, 'saf', '女', 100, 100, 100);`, function (err, data) { 2 if(err) { 3 console.log('錯了', err) 4 } 5 else { 6 console.log(data) 7 } 8 })
(2)SQL基本使用
1 SQL: 2 4大查詢 3 1.增 INSERT 4 INSERT INTO 表 (字段列表) VALUES(值列表) 5 6 INSERT INTO user_table (ID, name, gender, chinese, math, english) VALUES(0, 'wyb', '男', 75, 88, 69); 7 8 2.刪 DELETE 9 DELETE FROM 表 WHERE 條件 10 11 DELETE FROM user_table WHERE ID=3; 12 13 3.改 UPDATE 14 UPDATE 表 SET 字段=值, 字段2=值2, ... WHERE 條件 15 16 UPDATE user_table SET chinese=100 WHERE ID=2; 17 18 4.查 SELECT 19 SELECT 字段列表 FROM 表 WHERE 條件 20 21 SELECT name, gender FROM user_table WHERE ID=2;
3.數據庫實例 - 用戶註冊、登錄
(1)項目需求
1 用戶註冊、登錄: 2 1.數據庫結構(數據字典) 3 2.接口格式(接口文檔) 4 5 6 1.數據庫結構 7 ID username password 8 9 2.接口 --》 RESTful 10 註冊: 11 /reg?user=xxx&pass=xxx 12 =>{err: 0, msg: '緣由'} 13 14 登錄: 15 /login?user=xxx&pass=xxx 16 =>{err: 0, msg: '緣由'}
(2)實現
前端代碼存在項目下的www文件夾中,後端代碼位於項目根目錄下的server.js中
前端代碼:
1 <!-- author: wyb --> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <title>數據庫版登錄註冊</title> 8 <!-- 引入jQuery --> 9 <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script> 10 <style> 11 12 </style> 13 </head> 14 <body> 15 16 17 用戶名: <input type="text" id="user"> <br> 18 密碼: <input type="password" id="pass"> <br> 19 <input type="button" value="註冊" id="btn_reg"> 20 <input type="button" value="登錄" id="btn_login"> 21 22 <script> 23 /* 24 // 先後端接口: 25 用戶註冊: 26 /reg?user=xxx&pass=xxx 27 =>{error: 0, msg: '緣由'} 28 29 用戶登錄: 30 /login?user=xxx&pass=xxx 31 =>{error: 0, msg: '緣由'} 32 */ 33 $(function () { 34 // 註冊 35 $('#btn_reg').click(function () { 36 $.ajax({ 37 url: '/reg', 38 data: {user: $('#user').val(), pass: $('#pass').val()}, 39 dataType: 'json', 40 success(json){ 41 if(json.err){ 42 alert("error: " + json.msg) 43 } else { 44 alert("register success") 45 } 46 }, 47 error(){ 48 alert("fail") 49 } 50 }) 51 }) 52 53 // 登錄 54 $('#btn_login').click(function () { 55 $.ajax({ 56 url: '/login', 57 data: {user: $('#user').val(), pass: $('#pass').val()}, 58 dataType: 'json', 59 success(json){ 60 if(json.err){ 61 alert("error: " + json.msg) 62 } else { 63 alert("login success") 64 } 65 }, 66 error(){ 67 alert("fail") 68 } 69 }) 70 }) 71 }) 72 </script> 73 74 75 </body> 76 </html>
後端代碼:
1 const http = require('http') 2 const mysql = require('mysql') 3 const fs = require('fs') 4 const url = require('url') 5 const zlib = require('zlib') 6 const crypto=require('crypto') 7 8 const _key='sadfslekrtuew5iutoselgdtjiypoydse4ufhs.edtyo;s8te4arfeliawkfhtsie5tlfia;sefdshroiupeoutwyeli5gurse;ihf'; 9 10 function md5(str){ 11 let obj=crypto.createHash('md5') 12 obj.update(str); 13 14 return obj.digest('hex') 15 } 16 17 function md5_2(str){ 18 return md5(md5(str)+_key); 19 } 20 21 function log() { 22 console.log.apply(console, arguments) 23 } 24 25 26 // 鏈接池 27 let db = mysql.createPool({host: 'localhost', user: 'root', password: 'root', port: 3306, database: 'node'}) 28 29 let server = http.createServer(function (req, res) { 30 let {pathname, query} = url.parse(req.url, true) 31 log(pathname, query) 32 let {user, pass} = query 33 log(user, pass) 34 35 // 接口 36 switch (pathname){ 37 // 註冊: 38 case '/reg': 39 // 校驗數據 40 if(!user){ 41 res.write('{"err": 1, "msg": "username can\'t be null!"}') 42 res.end() 43 }else if(!pass){ 44 res.write('{"err": 1, "msg": "password can\'t be null!"}') 45 res.end() 46 }else if(!/^\w{4,16}$/.test(user)){ 47 res.write('{"err": 1, "msg": "username is invalid!"}') 48 res.end() 49 }else if(/['|"]/.test(user)){ 50 res.write('{"err": 1, "msg": "username is invalid!"}') 51 res.end() 52 }else if(/['|"]/.test(pass)){ 53 res.write('{"err": 1, "msg": "password is invalid!"}') 54 res.end() 55 }else{ 56 db.query(`SELECT * FROM user_table WHERE username='${user}';`, function (err, data) { 57 if(err) { 58 res.write('{"err": 1, "msg": "database error!"}') 59 res.end() 60 } 61 else if(data.length>0){ 62 res.write('{"err": 1, "msg": "this username exists!"}') 63 res.end() 64 } 65 else { 66 db.query(`INSERT INTO user_table (ID, username, password) VALUES(0, '${user}', '${md5_2(pass)}');`, function (err, data) { 67 if(err) { 68 res.write('{"err": 1, "msg": "database error!"}') 69 res.end() 70 } 71 else { 72 res.write('{"err": 0, "msg": "register success!"}') 73 res.end() 74 } 75 }) 76 } 77 }) 78 } 79 break 80 // 登錄: 81 case '/login': 82 if(!user){ 83 res.write('{"err": 1, "msg": "username can\'t be null"}'); 84 res.end(); 85 }else if(!pass){ 86 res.write('{"err": 1, "msg": "password can\'t be null"}'); 87 res.end(); 88 }else if(!/^\w{4,16}$/.test(user)){ 89 res.write('{"err": 1, "msg": "username is invaild"}'); 90 res.end(); 91 }else if(/['|"]/.test(pass)){ 92 res.write('{"err": 1, "msg": "password is invaild"}'); 93 res.end(); 94 }else{ 95 db.query(`SELECT * FROM user_table WHERE username='${user}'`, (err, data)=>{ 96 if(err){ 97 res.write('{"err": 1, "msg": "database error"}'); 98 res.end(); 99 }else if(data.length===0){ 100 res.write('{"err": 1, "msg": "no this user"}'); 101 res.end(); 102 }else if(data[0].password!==md5_2(pass)){ 103 res.write('{"err": 1, "msg": "username or password is incorrect"}'); 104 res.end(); 105 }else{ 106 res.write('{"err": 0, "msg": "success"}'); 107 res.end(); 108 } 109 }); 110 } 111 break; 112 113 default: 114 //獲取文件日期 115 fs.stat(`www${pathname}`, (err, stat)=>{ 116 if(err){ 117 res.writeHeader(404); 118 res.write('Not Found'); 119 res.end(); 120 }else{ 121 // 緩存 122 // 請求頭中有if-modified-since -> 不是第一次請求,以前瀏覽器中緩存了該頁面 123 if(req.headers['if-modified-since']){ 124 let oDate=new Date(req.headers['if-modified-since']); 125 let time_client=Math.floor(oDate.getTime()/1000); 126 let time_server=Math.floor(stat.mtime.getTime()/1000); 127 128 if(time_server>time_client){ // 服務器的文件時間 > 客戶端手裏的版本 129 sendFileToClient(); 130 }else{ 131 res.writeHeader(304); 132 res.write('Not Modified'); 133 res.end(); 134 } 135 } 136 // 請求頭中沒有if-modified-since -> 第一次請求 -> 直接返回要的文件 137 else{ 138 sendFileToClient(); 139 } 140 141 // 直接返回文件 142 function sendFileToClient(){ 143 //發送 144 let rs=fs.createReadStream(`www${pathname}`); 145 let gz = zlib.createGzip() 146 res.setHeader('Last-Modified', stat.mtime.toGMTString()); 147 res.setHeader('content-encoding', 'gzip') 148 //輸出 149 rs.pipe(gz).pipe(res) 150 151 rs.on('error', function(err){ 152 res.writeHeader(404); 153 res.write('Not Found'); 154 res.end(); 155 }); 156 } 157 } 158 }); 159 } 160 }) 161 162 server.listen(8080)