运行 此 node.js 函数中的多个 MySQL 查询
Run multiple MySQL queries in this node.js function
我有这个 node.js 函数,它在执行单个 MySQL 查询后 return 是一个 Promise。
function deletePoint(PointObj, door_id) {
return new Promise(function(resolve, reject) {
try {
var connection = jonMySQL.getMySQL_connection();
var mysql_query = '`DELETE FROM table1 WHERE user_id=? and door_id=?`';
var mysql_query_placeholder_arr = [PointObj.user_id, door_id];
connection.query(mysql_query, mysql_query_placeholder_arr, function(err, rows, fields) {
if (err) {
return reject(err);
} else {
resolve(rows);
}
});
} catch (err) {
reject(err);
}
});
}
上述功能工作正常。但是,如果我希望函数完成 运行 2 MYSQL 个查询怎么办?
第二个查询看起来像这样;
var mysql_query2 = '`DELETE FROM table2 WHERE user_id=? and door_id=?`';
var mysql_query2_placeholder_arr = [PointObj.user_id, door_id];
如何将第二个 MySQL 查询集成到函数中,以便 Promise 仅在两个查询都已执行后才会 return?
编辑:如果提供的答案可以处理最多多个查询(比如最多 5 个)而没有回调地狱,那将是更可取的。有人可以使用异步模块提供答案吗?
这样试试
function deletePoint(PointObj, door_id) {
return new Promise(function(resolve, reject) {
try {
var connection = jonMySQL.getMySQL_connection();
var mysql_query = 'DELETE FROM table1 WHERE user_id = ? and door_id = ?';
var mysql_query_placeholder_arr = [PointObj.user_id, door_id];
connection.query(mysql_query, mysql_query_placeholder_arr, function(err, rows1, fields) {
if (err) {
return reject(err);
} else {
var mysql_query2 = 'DELETE FROM table2 WHERE user_id = ? and door_id = ?';
var mysql_query2_placeholder_arr = [PointObj.user_id, door_id];
connection.query(mysql_query, mysql_query_placeholder_arr, function(err, rows2, fields) {
if (err) {
return reject(err);
} else {
resolve({
rows1: rows1,
rows2: rows2
});
}
});
}
});
} catch (err) {
reject(err);
}
});
}
建议
在回调中编写多个查询并不是更好的方法。
要解决此类案例,请根据场景
使用 async module with parallel or waterfall 方法
我建议创建一个通用的方法来执行查询,您可以根据需要修改它。
注意: 运行 您必须按顺序管理您在 resolve(rows)
中返回的行。并行地,所有行都在最终的 successCallback result
参数中作为对象数组生成。
function deletePoint(PointObj, door_id){
var query = {
text : '`DELETE FROM table1 WHERE user_id=? and door_id=?`',
placeholder_arr : [PointObj.user_id, door_id],
};
var query2 = {
text : '`DELETE FROM table2 WHERE user_id=? and door_id=?`',
placeholder_arr : [PointObj.user_id, door_id],
};
//do this if you want to execute the queries sequentially
mySQLQuery(query).then(mySQLQuery(query2)).then(successCallback).catch(errorCallback);
//do this if you want to execute the queries parallely
var query_arr = [mySQLQuery(query),mySQLQuery(query2),...];
Promise.all(query_arr).then(successCallback,errorCallback)
function successCallback(result){
console.log('done',result);
}
function errorCallback(err){
console.log('Error while executing SQL Query',err);
}
}
function mySQLQuery(query) {
var connection = jonMySQL.getMySQL_connection();
return new Promise(function(resolve, reject) {
try {
connection.query(query.text, query.placeholder_arr, function(err, rows, fields) {
if (err) {
return reject(err);
} else {
return resolve(rows);
}
});
} catch (err) {
return reject(err);
}
});
此外,您可以随时使用 async 模块,
async.parallel
用于并行执行,
async.waterfall
用于顺序执行,值从一个函数传递到另一个函数或
async.series
如果顺序函数之间不需要传递任何值。
我有这个 node.js 函数,它在执行单个 MySQL 查询后 return 是一个 Promise。
function deletePoint(PointObj, door_id) {
return new Promise(function(resolve, reject) {
try {
var connection = jonMySQL.getMySQL_connection();
var mysql_query = '`DELETE FROM table1 WHERE user_id=? and door_id=?`';
var mysql_query_placeholder_arr = [PointObj.user_id, door_id];
connection.query(mysql_query, mysql_query_placeholder_arr, function(err, rows, fields) {
if (err) {
return reject(err);
} else {
resolve(rows);
}
});
} catch (err) {
reject(err);
}
});
} 上述功能工作正常。但是,如果我希望函数完成 运行 2 MYSQL 个查询怎么办?
第二个查询看起来像这样;
var mysql_query2 = '`DELETE FROM table2 WHERE user_id=? and door_id=?`';
var mysql_query2_placeholder_arr = [PointObj.user_id, door_id];
如何将第二个 MySQL 查询集成到函数中,以便 Promise 仅在两个查询都已执行后才会 return?
编辑:如果提供的答案可以处理最多多个查询(比如最多 5 个)而没有回调地狱,那将是更可取的。有人可以使用异步模块提供答案吗?
这样试试
function deletePoint(PointObj, door_id) {
return new Promise(function(resolve, reject) {
try {
var connection = jonMySQL.getMySQL_connection();
var mysql_query = 'DELETE FROM table1 WHERE user_id = ? and door_id = ?';
var mysql_query_placeholder_arr = [PointObj.user_id, door_id];
connection.query(mysql_query, mysql_query_placeholder_arr, function(err, rows1, fields) {
if (err) {
return reject(err);
} else {
var mysql_query2 = 'DELETE FROM table2 WHERE user_id = ? and door_id = ?';
var mysql_query2_placeholder_arr = [PointObj.user_id, door_id];
connection.query(mysql_query, mysql_query_placeholder_arr, function(err, rows2, fields) {
if (err) {
return reject(err);
} else {
resolve({
rows1: rows1,
rows2: rows2
});
}
});
}
});
} catch (err) {
reject(err);
}
});
}
建议
在回调中编写多个查询并不是更好的方法。
要解决此类案例,请根据场景
使用 async module with parallel or waterfall 方法我建议创建一个通用的方法来执行查询,您可以根据需要修改它。
注意: 运行 您必须按顺序管理您在 resolve(rows)
中返回的行。并行地,所有行都在最终的 successCallback result
参数中作为对象数组生成。
function deletePoint(PointObj, door_id){
var query = {
text : '`DELETE FROM table1 WHERE user_id=? and door_id=?`',
placeholder_arr : [PointObj.user_id, door_id],
};
var query2 = {
text : '`DELETE FROM table2 WHERE user_id=? and door_id=?`',
placeholder_arr : [PointObj.user_id, door_id],
};
//do this if you want to execute the queries sequentially
mySQLQuery(query).then(mySQLQuery(query2)).then(successCallback).catch(errorCallback);
//do this if you want to execute the queries parallely
var query_arr = [mySQLQuery(query),mySQLQuery(query2),...];
Promise.all(query_arr).then(successCallback,errorCallback)
function successCallback(result){
console.log('done',result);
}
function errorCallback(err){
console.log('Error while executing SQL Query',err);
}
}
function mySQLQuery(query) {
var connection = jonMySQL.getMySQL_connection();
return new Promise(function(resolve, reject) {
try {
connection.query(query.text, query.placeholder_arr, function(err, rows, fields) {
if (err) {
return reject(err);
} else {
return resolve(rows);
}
});
} catch (err) {
return reject(err);
}
});
此外,您可以随时使用 async 模块,
async.parallel
用于并行执行,async.waterfall
用于顺序执行,值从一个函数传递到另一个函数或async.series
如果顺序函数之间不需要传递任何值。