Nodejs与Mysql交互实现(异步写法,同步写法)

(1)搭建Nodejs与Mysql的异步交互接口

var mysql = require('mysql');

var connection = mysql.createConnection({
	host     : dbInfo.host,
	user     : dbInfo.user,
	password : dbInfo.password,
	port     : dbInfo.port,
	database : dbInfo.database,
	timezone : dbInfo.timezone
});
/*
参数说明:
sql: SQL语句,string类型
args:SQL语句中的参数,Array类型
callback:异步回调函数
*/
function dataBaseControl(sql, args, callback){
    if(args == null || args.length == 0){
        connection.query(sql, function(error, results, fields){
            if(error){
                console.error(error);
                callback(null);
                return;
            }
            callback(results);
        });
    } else {
        connection.query(sql, args, function(error, results, fields){
            if(error){
                console.error(error);
                callback(null);
                return;
            }
            callback(results);
        });
    }
}

由于这是我从项目中截取的一些代码,有些函数在这篇博客中没有具体实现,有些函数如 _structureAnalysis 可以在这篇博客找到其具体实现。

(2)异步调用示例

/*
参数说明:
sqlObj: SQL语句结构体,Object类型
{
	"sql": sql语句,
	"value": sql语句中的参数值
}
callback:异步回调函数
*/
function ControlAPI_obj(data, callback){
	var sqlObj = _structureAnalysis(data);
	dataBaseControl(sqlObj["sql"], sqlObj["value"], (result)=>{
		if (result == null || result.length == 0) {
			callback(null);
		} else {
			callback(result);
		}
	});
};

(3)将异步改为同步写法

这里使用Promise重新将接口进行包装,使得可以使用async/await进行调用,符合同步的编码习惯

/*
参数说明:
sqlObj: SQL语句结构体,Object类型
{
	"sql": sql语句,
	"value": sql语句中的参数值
}
return:语句执行结果
*/

// 传入单条SQL语句
var ControlAPI_obj_async = function(data) {
	var sqlObj = _structureAnalysis(data);
	return new Promise((resolved, rejected)=>{
		dataBaseControl(sqlObj["sql"], sqlObj["value"], (result)=>{
			if (result === null) {
				rejected(null);
			} else {
				resolved(result);
			}
		});
	});
}

// 传入多条SQL语句
var ControlAPI_objs_async = function(...vars) {
	let len = vars.length;
	let promiseList = [];
	for(let i = 0; i < len; i++){
		let sqlObj = _structureAnalysis(vars[i]);
		promiseList.push(new Promise((resolved, rejected)=>{
			dataBaseControl(sqlObj["sql"], sqlObj["value"], (result)=>{
				if (result === null) {
					rejected(null);
				} else {
					resolved(result);
				}
			});
		}));
	}
	return Promise.all(promiseList);
}

使用方式

// 同步写法
async function(...){
	[...]
	try {
		let result_single = await ControlAPI_obj_async(obj1);
		let result_multi = await ControlAPI_objs_async(obj1, obj2,...,objn);
	} catch (error) {
		// 捕获await中Promise的reject的数据
	}
	[...]
}
// 异步写法
function(...) {
	ControlAPI_obj(data, (result) => {
		// 对result进行操作
	})
}

你可能感兴趣的:(作业)