NodeJS+Mysql2快速实现数据库的增删改查功能,手把手教你使用Promise对象转换回调函数

基于Node+MySQL实现CURD功能

作 者:Taylor

B站ID:Rong姐姐很可爱

时 间:2019年9月14日 下午17:30

1.场景

​ 在使用node进行日常开发学习中,难免会进行数据库相关的增删改查功能,对于初学者而言,常见的数据库便是Mysql数据库,因此以下便是详细述说如何用Mysql2模块,在node语言的基础上完成CURD功能;

2.CRUD功能

​ 在开发中几乎每天都要接触到数据库的CURD功能,所谓的CURD功能,即:C(create:数据创建)、U(update:数据更新)、R(read:数据读取)、D(delete:数据删除)四种功能,当然进阶还有所谓的多种查询、批量添加、批量数据更新等功能;

3.实现流程
  • ​ 数据库连接配置

    // 不论是jdbc连接数据库,开始mysql2模块来连接数据库,都需要知道数据库的基本用户信息
    const dbconfig={
        // 主机IP地址
        host:'127.0.0.1',
        port:3306,
        database:'test',
        user:'root',
        password:'123456',
        //以上为必须配置,还可以加一些额外的配置
        waitForConnections:true,
        // 数据库连接限制
        connectionLimit:10
    }
    
  • 引入mysql2=模块

    // 也可以直接用mysql模块,只是myql2模块比较新
    const mysql=require('mysql2');
    
  • 创建连接

    const connection=mysql.createConnection({
            // 主机IP地址
        host:'127.0.0.1',
        port:3306,
        database:'test',
        user:'root',
        password:'123456',
        //以上为必须配置,还可以加一些额外的配置
        waitForConnections:true,
        // 数据库连接限制
        connectionLimit:10
    })
    // 使用connection前,一定要打开连接
    connection.connect();
    // 使用connection后,一定要及时关闭连接;
    connection.end();
    
  • 数据库操作

    // 创建连接
    const connection=mysql.createConnection(dbconfig);
    // 开连接,
    connection.connect();
    // 定义sql,这里可以根据sql来具体区分执行什么操作
    const sql='insert into table (..,..,..,) values (?,?,?)';
    // 执行quer语句
    connnection.query(sql,[参数数组],(err,result)=>{
        if(err){
            // 操作失败
        }
        // 操作成功,result为结果
        // 因为是回调方法,所以需要在回调方法执行完,在关闭
        connection.end();
    });
    // 当然关于connection连接的关闭,也可以采用then语句
    connnection.query(sql,[参数数组],(err,result)=>{
        if(err){
            // 操作失败
        }
        // 操作成功,result为结果
    }).then((connection)=>{
        // 这里是等前面顺利执行完,在来执行
        connection.end();
    });
    
4.CRUD封装

​ 通过前面数据库操作,可以很明显的体会到,可以根据定义sql语句的不用,具体来实现数据的增删改查甚至谁是批量查询、插入等高阶操作;

/**
* 定义方法来封装
* sql:需要操作的sql语句,自定义
* connection: 通过mysql2模块创建数据库连接
* params:执行sql语句需要使用到的参数,以数组的形式
*/
function dbUtils(sql,params,connection){
    // 开连接
    connection.connect();
    // 具体调用,执行sql
    connection.query(sql,params,(err,result)=>{
        if(err){
            // 操作失败
        }
       	// 操作成功,可在执行完操作成功后的操作后,在关闭连接
        ....
        connection.end();
    });
}
// 使用的时候,直接调用就可以了;
5.CRUD进一步封装

​ 可以看到上面的封装其实效果并不好,因为quer()方法执行的时候,是通过回调的方式,如果说需要在外部通过使用query()的返回值,根据返回值进一步操作的话,就明显的感觉上面的封装带来的弊端,因此可以用Promise对象来解决回调方法返回值的问题;

/**
* 进一步来封装
* sql:需要操作的sql语句,自定义
* connection: 通过mysql2模块创建数据库连接
* params:执行sql语句需要使用到的参数,以数组的形式
*/
function dbUtils(sql,params,connection){
	const tempResult =	new Promise((resolve,reject)=>{
        // 开连接
    	connection.connect();
        // 执行sql
        connection.query(sql,params,(err,result)=>{
            // 利用resolve、reject来处理result和err,向外抛,且二者自带return功能
            if(err){
                reject(err);
            }
            // 成功
            resolve(result);
        })
    });
    // 关闭连接
    connection.end();
    // 返回结果
   	return tempResult;
}
// 使用的时候,如果是reject(err)往外跑异常,则需要捕获
try{
    const result=dbUtils(sql,params,connection);
    if(result!==undefined){
        // 执行成功,进行其他操作
    }
}catch(err){
    // 出错
}
// 就这样异步执行的回调函数就可以利用Promise对象转换为同步执行
6.进一步了解Priomise对象

​ Promise对象提供两个常见的resolve()、reject()方法 ;可以reject()方法来处理异常,向外抛出,用resolve()来处理正常操作对应的结果,当然,Promise()对象也提供了原型链的操作,用then()来处理获取resolve()方法返回的值,用catch()来捕获reject()方法抛出来的异常;

// 例如,定义一个Promise对象
let pormise=new Promise((resovle,reject)=>{
    resovle(43);
});
promise.then(value=>{
    console.log(value);  //输出43
});
let promiseReject=new Promise((reject)=>{
    reject(44);
})
promiseReject.then(value=>{
    console.log(value); // 输出undefined
});
promiseReject.catch(err=>{
    console.log(err); // 输出44
})
// 当然,Promise也支持链式写法
new Promise((resolve,reject)=>{
   	const result= function(value){
        // 假设value有值
        if(value%2===0){
            resovle(1)
        }
        reject(0)
    }
}).then(resolveValue=>{
    // 获取resolve向外抛出来的数值;
    console.log(resolveValue);// 输出1
}).catch(rejectValue=>{
    // 捕获reject抛出的数值;
   console.log(rejectValue);// 输出0
});

Promise对象参考连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值