内容: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)