node使用MySQL数据库
内容:
1.node连接数据库
2.数据库常用操作
3.数据库实例 - 用户注册、登陆
1.node连接数据库
(1)下载mysql模块
(2)使用mysql模块连接数据库
let db=mysql.createConnection({host, port, user, password, database});
这样连接也有缺陷:连接会一直占着数据库,别的无法在此连接结束之前连接数据库,对于此我们可以使用连接池:
// 连接池
let db = mysql.createPool(配置)
实例:
const mysql = require('mysql') // 普通连接
// let db = mysql.createConnection({host: 'localhost', user: 'root', password: 'root', port: 3306, database: 'node'})
// 连接池
let db = mysql.createPool({host: 'localhost', user: 'root', password: 'root', port: 3306, database: 'node'})
2.数据库常用操作
(1)node的mysql数据库操作
db.query(sql, (err, data)=>{});
db.query(`INSERT INTO user_table (ID, name, gender, chinese, math, english) VALUES(0, 'saf', '女', 100, 100, 100);`, function (err, data) {
if(err) {
console.log('错了', err)
}
else {
console.log(data)
}
})
(2)SQL基本使用
SQL:
4大查询
1.增 INSERT
INSERT INTO 表 (字段列表) VALUES(值列表) INSERT INTO user_table (ID, name, gender, chinese, math, english) VALUES(0, 'wyb', '男', 75, 88, 69); 2.删 DELETE
DELETE FROM 表 WHERE 条件 DELETE FROM user_table WHERE ID=3; 3.改 UPDATE
UPDATE 表 SET 字段=值, 字段2=值2, ... WHERE 条件 UPDATE user_table SET chinese=100 WHERE ID=2; 4.查 SELECT
SELECT 字段列表 FROM 表 WHERE 条件 SELECT name, gender FROM user_table WHERE ID=2;
3.数据库实例 - 用户注册、登陆
(1)项目需求
用户注册、登陆:
1.数据库结构(数据字典)
2.接口格式(接口文档) 1.数据库结构
ID username password 2.接口 --》 RESTful
注册:
/reg?user=xxx&pass=xxx
=>{err: 0, msg: '原因'} 登陆:
/login?user=xxx&pass=xxx
=>{err: 0, msg: '原因'}
(2)实现
前端代码存在项目下的www文件夹中,后端代码位于项目根目录下的server.js中
前端代码:
<!-- author: wyb -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>数据库版登陆注册</title>
<!-- 引入jQuery -->
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<style> </style>
</head>
<body> 用户名: <input type="text" id="user"> <br>
密码: <input type="password" id="pass"> <br>
<input type="button" value="注册" id="btn_reg">
<input type="button" value="登陆" id="btn_login"> <script>
/*
// 前后端接口:
用户注册:
/reg?user=xxx&pass=xxx
=>{error: 0, msg: '原因'} 用户登陆:
/login?user=xxx&pass=xxx
=>{error: 0, msg: '原因'}
*/
$(function () {
// 注册
$('#btn_reg').click(function () {
$.ajax({
url: '/reg',
data: {user: $('#user').val(), pass: $('#pass').val()},
dataType: 'json',
success(json){
if(json.err){
alert("error: " + json.msg)
} else {
alert("register success")
}
},
error(){
alert("fail")
}
})
}) // 登陆
$('#btn_login').click(function () {
$.ajax({
url: '/login',
data: {user: $('#user').val(), pass: $('#pass').val()},
dataType: 'json',
success(json){
if(json.err){
alert("error: " + json.msg)
} else {
alert("login success")
}
},
error(){
alert("fail")
}
})
})
})
</script> </body>
</html>
后端代码:
const http = require('http')
const mysql = require('mysql')
const fs = require('fs')
const url = require('url')
const zlib = require('zlib')
const crypto=require('crypto') const _key='sadfslekrtuew5iutoselgdtjiypoydse4ufhs.edtyo;s8te4arfeliawkfhtsie5tlfia;sefdshroiupeoutwyeli5gurse;ihf'; function md5(str){
let obj=crypto.createHash('md5')
obj.update(str); return obj.digest('hex')
} function md5_2(str){
return md5(md5(str)+_key);
} function log() {
console.log.apply(console, arguments)
} // 连接池
let db = mysql.createPool({host: 'localhost', user: 'root', password: 'root', port: 3306, database: 'node'}) let server = http.createServer(function (req, res) {
let {pathname, query} = url.parse(req.url, true)
log(pathname, query)
let {user, pass} = query
log(user, pass) // 接口
switch (pathname){
// 注册:
case '/reg':
// 校验数据
if(!user){
res.write('{"err": 1, "msg": "username can\'t be null!"}')
res.end()
}else if(!pass){
res.write('{"err": 1, "msg": "password can\'t be null!"}')
res.end()
}else if(!/^\w{4,16}$/.test(user)){
res.write('{"err": 1, "msg": "username is invalid!"}')
res.end()
}else if(/['|"]/.test(user)){
res.write('{"err": 1, "msg": "username is invalid!"}')
res.end()
}else if(/['|"]/.test(pass)){
res.write('{"err": 1, "msg": "password is invalid!"}')
res.end()
}else{
db.query(`SELECT * FROM user_table WHERE username='${user}';`, function (err, data) {
if(err) {
res.write('{"err": 1, "msg": "database error!"}')
res.end()
}
else if(data.length>0){
res.write('{"err": 1, "msg": "this username exists!"}')
res.end()
}
else {
db.query(`INSERT INTO user_table (ID, username, password) VALUES(0, '${user}', '${md5_2(pass)}');`, function (err, data) {
if(err) {
res.write('{"err": 1, "msg": "database error!"}')
res.end()
}
else {
res.write('{"err": 0, "msg": "register success!"}')
res.end()
}
})
}
})
}
break
// 登陆:
case '/login':
if(!user){
res.write('{"err": 1, "msg": "username can\'t be null"}');
res.end();
}else if(!pass){
res.write('{"err": 1, "msg": "password can\'t be null"}');
res.end();
}else if(!/^\w{4,16}$/.test(user)){
res.write('{"err": 1, "msg": "username is invaild"}');
res.end();
}else if(/['|"]/.test(pass)){
res.write('{"err": 1, "msg": "password is invaild"}');
res.end();
}else{
db.query(`SELECT * FROM user_table WHERE username='${user}'`, (err, data)=>{
if(err){
res.write('{"err": 1, "msg": "database error"}');
res.end();
}else if(data.length===0){
res.write('{"err": 1, "msg": "no this user"}');
res.end();
}else if(data[0].password!==md5_2(pass)){
res.write('{"err": 1, "msg": "username or password is incorrect"}');
res.end();
}else{
res.write('{"err": 0, "msg": "success"}');
res.end();
}
});
}
break; default:
//获取文件日期
fs.stat(`www${pathname}`, (err, stat)=>{
if(err){
res.writeHeader(404);
res.write('Not Found');
res.end();
}else{
// 缓存
// 请求头中有if-modified-since -> 不是第一次请求,之前浏览器中缓存了该页面
if(req.headers['if-modified-since']){
let oDate=new Date(req.headers['if-modified-since']);
let time_client=Math.floor(oDate.getTime()/1000);
let time_server=Math.floor(stat.mtime.getTime()/1000); if(time_server>time_client){ // 服务器的文件时间 > 客户端手里的版本
sendFileToClient();
}else{
res.writeHeader(304);
res.write('Not Modified');
res.end();
}
}
// 请求头中没有if-modified-since -> 第一次请求 -> 直接返回要的文件
else{
sendFileToClient();
} // 直接返回文件
function sendFileToClient(){
//发送
let rs=fs.createReadStream(`www${pathname}`);
let gz = zlib.createGzip()
res.setHeader('Last-Modified', stat.mtime.toGMTString());
res.setHeader('content-encoding', 'gzip')
//输出
rs.pipe(gz).pipe(res) rs.on('error', function(err){
res.writeHeader(404);
res.write('Not Found');
res.end();
});
}
}
});
}
}) server.listen(8080)
node使用MySQL数据库的更多相关文章
- node连接mysql数据库
1. 创建项目,安装mysql 创建项目文件夹test, 在test文件夹下yarn add mysql --save安装mysql: 2. node使用mysql 在test文件夹下,创建test. ...
- 你不会用node 操作mysql数据库吗?
http://static.runoob.com/download/websites.sql这是实例 websites.sql文件1.安装node的mysql服务 npm install mysql ...
- Node.JS + Mysql数据库
服务嘛,当然离不开数据库了,你要是见到数据就哭了,我建议你还是看看本文,不要做数据哭啊,哈哈哈 要做 ‘数据酷’嘛,哈哈哈 一 安装 1. wget -i -c http://dev.mysql.co ...
- Node 操作 MySQL 数据库
1, 下载 mysql 依赖 => npm -i mysql 2, 写一个核心工具类, 用于获取线程池连接 mysql-util.js // 引入 mysql 数据库连接依赖 const mys ...
- Node 操作MySql数据库
1, 需要安装 MySQL 依赖 => npm i mysql -D 2, 封装一个工具类 mysql-util.js // 引入 mysql 数据库连接依赖 const mysql = re ...
- node 连接 mysql 数据库三种方法------笔记
一.mysql库 文档:https://github.com/mysqljs/mysql mysql有三种创建连接方式 1.createConnection 使用时需要对连接的创建.断开进行管理 2. ...
- node操作mysql数据库
1.建立数据库连接:createConnection(Object)方法 该方法接受一个对象作为参数,该对象有四个常用的属性host,user,password,database.与php ...
- 记一段使用node对mysql数据库做处理
所用到的存储过程如下: temp_get_userCount: BEGIN #Routine body goes here... SELECT COUNT(id) as num FROM tbl_us ...
- 使用node js 操作 Mysql 数据库
使用node js 操作 Mysql 数据库 http://www.nodejs.org/ //node js 数据库操作 MySQL //使用https://github.com/felixge/n ...
随机推荐
- gcc -o test test.c编译报错
报错内容 /tmp/cc7eQyD4.o: In function `main':test.c:(.text+0x51): undefined reference to `sqrt'collect2: ...
- [LeetCode&Python] Problem 617. Merge Two Binary Trees
Given two binary trees and imagine that when you put one of them to cover the other, some nodes of t ...
- HTML5和CSS3阶段,我是如何学习的?
经过一个月的学习,我收获了许多,今天的测验是做一个企业中文网站,令我自己感到吃惊的是,我前前后后用了4个小时就完成了,这在一个月前根本不可能,因为对布局属性的理解还不够深刻,常常会在调试中浪费大量时间 ...
- 如何调优JVM
堆设置 -Xmx3550m:设置JVM最大堆内存 为3550M. -Xms3550m:设置JVM初始堆内存 为3550M.此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存. -X ...
- ThinkPHP 5 insertall 只插入最后一条数据的问题
问题来源: Steed 2018/1/5 11:30:25 @流年 我用fetchsql查看的sql,发现数据都是最后一条 Steed 2018/1/5 11:30:39 我也不知道是什么问题,我打印 ...
- 二分查找算法,java实现
二分查找算法是在有序数组中用到的较为频繁的一种算法. 在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间复杂度为O(n),但二分查找算法则更优,因为其查找时间复杂度 ...
- Spring MVC 向页面传值-Map、Model、ModelMap、ModelAndView
Spring MVC 向页面传值,有4种方式: ModelAndView Map Model ModelMap 使用后面3种方式,都是在方法参数中,指定一个该类型的参数. Model Model 是一 ...
- spring 注解列表
table th:first-of-type { width: 15%; } table th:nth-of-type(2) { } 注解 作用 例子 @SuppressWarnings 忽略警告 类 ...
- mysql 中find_in_set()和in()用法比较
mysql 中find_in_set()和in()用法比较 在mysql中in可以包括指定的数字,而find_in_set()用于特定的数据类型. find_in_set 函数使用方法 个例子来说:有 ...
- 【jmeter】jmeter环境搭建
一. 工具描述 apache jmeter是100%的java桌面应用程序,它被设计用来加载被测试软件功能特性.度量被测试软件的性能.设计jmeter的初衷是测试web应用,后来又扩充了其它的功能.j ...