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 ...
随机推荐
- FreeOpcUa compile
/********************************************************************************* * FreeOpcUa compi ...
- OpenCV-bwLabel-实现图像连通组件标记与分析
OpenCV实现图像连通组件标记与分析- matlab bwLabel; code: #include <opencv2/opencv.hpp> #include <iostream ...
- Linux系统nat模式联网——VM是12 系统是cantos7
>点击还原默认设置,然后确定 >选择Vmnet8,VMnet信息自动选中NAT模式 记住子网IP和子网掩码 >点击NAT设置,记住网关IP >点击DHCP.记住IP范围 > ...
- (2)socket的基础使用(基于TCP协议)
socket()模块函数用法 基于TCP协议的套接字程序 netstart -an | findstr 8080 #查看所有TCP和UDP协议的状态,用findstr进行过滤监听8080端口 服务端套 ...
- mysql 常用linux命令
★ 数据导出命令 D:\Program Files\MySQL\MySQL Server 5.6.39\bin 导出: mysqldump -u root -p cela_sub > D:/d ...
- ppt罗列项排版
关于罗列项的排版(1,....2,......3,......4,........)
- 转oracle 学习- 数据类型
oracle数据类型 有道是,磨刀不误砍柴工.多了解一些底层的东西,对于Oracle开发.维护大有裨益.个人总结了一些Oracle数据类型集解,相信读者阅读了本文以后,Oracle数据库开发起来会事半 ...
- js模板引擎之juicer,特别好用
中文文档地址 https://www.npmjs.com/package/juicer Juicer基础知识:语法2 http://blog.163.com/lvshutao@126/blog/st ...
- Socket-Vs-WebSocket-TestTool
项目地址 : https://github.com/kelin-xycs/Socket-Vs-WebSocket-TestTool Socket-Vs-WebSocket-TestTool 一个用 ...
- centos 下nginx源码编译安装
1.下载nginx 进入nginx官网下载nginx的稳定版本,我下载的是1.10.3. 下载:wget http://nginx.org/download/nginx-1.10.3.tar.gz 解 ...