1,mysql模块后端连接数据库
1,导入数据库操作模块 mysql
-
var mysql = require("mysql");
2,设置数据库连接信息,创建连接对象
每个连接对象只能连接一个数据库。利用 mysql.createConnection({数据库名,端口名,用户名,密码,数据库名})来设置数据库连接信息。
var db = mysql.createConnection({ host: "localhost", //本地数据库 port: "3306", //数据库端口 user: "root", //用户名 password: "123456", //密码 database: "haojing2" //目标数据库名 })
3,连接数据库
-
利用 mysql.createConnection({})的返回对象db调用connect(回调函数)连接数据库
-
db.query(mysql语句,回调函数(err,data))函数进行增删改查,query函数的第二个参数是回调函数,回调函数的第二个参数是查到数据时返回的数据
-
用``模板字符串写mysql语句比较方便,注意判断字段值时要加上""才可以
// 开始连接数据库 db.connect(function(err) { if (err) { console.log("数据库连接失败", err.message); return; } console.log("数据库连接成功"); // 调用query函数执行sql语句,实现增删改查 // 增 db.query(`insert into users (username,password,age,sex) values ('小红','123',30,'女')`) // 删 db.query(`delete from users where age>=30`) // 改 db.query(`update users set username="李四四" where username="李四"`) // 查,结果是一个数组, RowDataPacket指的是表里边每一行的数据都是对象数据 db.query("select username from users", function(err, data) { console.log(err, data); }) // 数据库连接并操作之后,不会主动关闭,会一直占用内存,所以,一个连接处理完数据后,建议手动关闭连接,释放数据库连接占用的内存 db.end(); //断开数据库连接 db.query("select age from users", function(err, data) { if (err) console.log(err.message); // Cannot enqueue Query after invoking quit. 数据库断开之后,不能用query函数 }) });
4,关闭数据库
-
db.end()断开数据库连接,数据库连接并操作之后,不会主动关闭,会一直占用内存,所以,一个连接处理完数据后建议手动关闭连接,释放数据库连接占用的内存。
Cannot enqueue Query after invoking quit. 数据库断开之后,不能用query函数
db.end()必须写在对数据库操作之后,否则会报上一句错误
2,自己把连接数据库的语句封装成模块使用
2.1 创建一个js文件与index.js同级
2.2 在新创建的js文件中封装连接数据库语句
2.2.1 导入mysql模块
-
var mysql = require("mysql");
2.2.2 创建数据库操作信息对象
定义一个对象来接收数据库连接信息,当作连接对象mysql.createConnection(options)的参数
var options = { host: "localhost", //本地数据库 port: "3306", //数据库端口 user: "root", //用户名 password: "123456", //密码 database: "haojing2" //目标数据库名 }
2.2.3 先尝试连接数据库,判断数据库是否正常
2.2.3.1 创建连接对象
var db = mysql.createConnection(options);
2.2.3.2 db.connect()连接数据库
var db = mysql.createConnection(options); db.connect(function(err) { if (err) console.log("数据库连接失败", err.message); else console.log("数据库连接成功"); db.end() })
2.2.4 封装一个数据库操作函数
思路:封装函数里边有数据库连接对象,利用该对象进行数据库连接,并在数据库连接中对数据库进行增删改查,需要在封装的函数传入两个参数,一个时mysql语句参数,另外一个是查数据库时需要向外边传输数据而所需的回调参数。只有查数据库时才需要把查找的数据提取出来,如果用return提取不行,因为return时同步执行的,而数据库查询时异步执行的,规定同步和异步同时存在时,先执行的同步操作,所以取不到数据。
// 封装一个数据库操作函数 function action(sqlStr, callback) { // 创建连接对象 var db = mysql.createConnection(options); // 开始连接数据库 db.connect(function(err) { // if (err) { // console.log("数据库连接失败", err.message); // return; // } // console.log("数据库连接成功"); db.query(sqlStr, function(err, data) { if (err) { console.log("数据库操作失败,请检查sql语句", err.message); } else { console.log("数据库操作成功"); // 如果是查询语句,返回查询结果 if (sqlStr.startsWith("select")) { // 如果是查询操作,会得到查询结果data,此时通过返回值的形式把结果返回 console.log("查询结果1", data); // 这里return的值在调用时拿不到,原因是异步回调函数中不能通过同步return返回结果,同步代码总是在异步代码之前执行 // 所以异步查询结束之前,同步return就已经执行,undefined,此时使用回调函数返回结果即可 // return data; callback(data); } } // 操作完成后,关闭数据库连接 db.end(); }) }) }
2.2.5 把封装的操作函数导出
module.exports = action;
2.2.6 在index.js引入自定义模块,引入时需要加入路径
var mydbAction = require("./mysqlMdule")
2.2.7 利用自己封装的函数进行数据库的增删改查操作,并且返回值
mydbAction("select username from users", function(data) { console.log("查询结果2", data); })
3,登录注册连接数据库
登陆注册数据库只需要把之前写的登录、注册接口中加入连接数据库并进行查的操作。不过连接之前需要引入自定义模块。
3.1 登录接口连接数据库
思路:查询请求数据是否和数据库的字段值相等,相等说明用户存在,同时判断账户和密码是否都一样。
// 登录接口 app.post("/login", function(req, res) { console.log(req.body); // res.send("post登陆成功"); if (!req.body.username || !req.body.password) { res.send("账号或密码不能为空") return; } usersDB(`select * from users where username="${req.body.username}" and password="${req.body.password}"`, function(data) { if (data.length == 0) { res.json({ msg: "账号或密码错误" }) } else { res.json({ msg: "登陆成功" }) } }) })
3.2 注册接口连接数据库
思路:连接数据库判断账号是否存在。如果不存在,就需要向数据库中添加该请求数据,如果存在,则提示用户存在。
app.post("/register", function(req, res) { console.log(req.body); // res.send("post登陆成功"); if (!req.body.username || !req.body.password) { res.send("账号或密码不能为空") return; } // 1,判断账号是否存在 usersDB(`select * from users where username="${req.body.username}"`, function(data) { if (data.length == 0) { // 2,把账号信息写入数据库 usersDB(`insert into users (username,password) values ("${req.body.username}","${req.body.password}")`) res.json({ msg: "注册成功" }) } else { res.json({ msg: "用户名已经存在,注册失败" }) } }) })
4,模块引擎,art模板(服务器搭建好为前提)
4.1前端开发有两种模式:
1,前后端分离模式:浏览器利用ajax向服务器发送请求,服务器收到请求调用相应的接口,向浏览器响应 响应数据,浏览器把响应数据动态渲染到页面上
2,前后端不分离模式:后端模板渲染:浏览器用ajax向服务器发送请求,服务器中存在网页模板,在服务器中把模板和数据结合,生成一个网页,然后把网页返回给浏览器。服务器将html网页模板发送给浏览器,浏览器直接显示网页
4.2 导入模块 art-temple、express-art-temple、express
导入模块引擎---art模板,需要下载两个模块。分别是art-template 和 express-art-template。但是,导入时只需要导入express-art-template这个模块即可。下载必须下载这三个模块!
var art = require("express-art-template"); var express = require("express")
4.3 设置模板引擎 app.engine(参数1,参数2)
-
.参数1是模板的文件格式,分别是.art格式 和 .html格式
-
参数2是模块模板 art
app.engine("html", art);
4.4 设置访问主页接口app.get("/",function(req,res){})
4.4.1 浏览器访问服务器地址顺序
当浏览器访问服务器地址时,服务器会优先从public静态目录中查找相应资源,如果有,就返回给浏览器。如果没有,再从服务器接口中查找路径;如果有,就调用这个接口,如果没有,就返回 Cannot GET。
4.4.2 app.get("/",function(req,res){})
-
/表示 /index.html主页
-
网页模板文件要求必须写在根目录的views文件夹中,通过res.render返回网页模板
4.4.3 res.render(views目录下的网页模块名,{数据})
-
参数1是views目录下的模板名
-
参数2是模板中渲染的动态数据,对象结构