mysql模块连接数据库

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是模板中渲染的动态数据,对象结构

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值