如何使用NodeJs Async更新数据库中的数组数据?
我是NodeJs的新手,我发现JS的非阻塞和异步特性极难理解和处理, 我有一段代码可以迭代一个数组 对于每次迭代,我都应该进行数据库更新。
有人能提供正确的异步库函数实现并帮助修复我的代码吗?
代码示例 -
function updateFunction(conn, requestBody, callback) {
let arr = [];
async.each(requestBody.arr, function(item, callback) {
let sqlData = []
let columns = "";
if(item.columnData != null){
sqlData.push(item.columnData);
columns += "`columnName` = ?,";
}
if(columns != ''){
columns = columns.substring(0,columns.length-1);
let sqlQuery = 'UPDATE someTable SET '+columns
+' WHERE id = "' + item.id + '"';
conn.query(sqlQuery, sqlData, function (err, result) {
if (err) {
return callback(err, false);
}
})
}
else{
return callback(null, false);
}
columns = "";
sqlData = [];
},
function(err, results) {
//Code never reaches here, don't know why
if (err) {
return callback(err, false);
}
else{
return callback(null, true);
}
});
} // END
回答如下:
在数据库查询调用期间,成功查询时不会调用回调,因此导致代码永远不会到达最终回调。
您将需要在if (err) { return callback(err); }
之后添加另一个return语句,以让异步知道您的数据库查询已完成。
另外一点,according to the docs, async每个方法的最终回调都不会在其回调中调用结果。
当所有iteratee函数完成或发生错误时调用的回调。用(错误)调用。
因此,您不需要将值传递给iteratee函数中的回调语句。
修改您的代码以执行此操作,它将起作用。
conn.query(sqlQuery, sqlData, function (err, result) {
if (err) {
return callback(err);
}
return callback(null);
})
希望这可以帮助。
如何使用NodeJs Async更新数据库中的数组数据?
我是NodeJs的新手,我发现JS的非阻塞和异步特性极难理解和处理, 我有一段代码可以迭代一个数组 对于每次迭代,我都应该进行数据库更新。
有人能提供正确的异步库函数实现并帮助修复我的代码吗?
代码示例 -
function updateFunction(conn, requestBody, callback) {
let arr = [];
async.each(requestBody.arr, function(item, callback) {
let sqlData = []
let columns = "";
if(item.columnData != null){
sqlData.push(item.columnData);
columns += "`columnName` = ?,";
}
if(columns != ''){
columns = columns.substring(0,columns.length-1);
let sqlQuery = 'UPDATE someTable SET '+columns
+' WHERE id = "' + item.id + '"';
conn.query(sqlQuery, sqlData, function (err, result) {
if (err) {
return callback(err, false);
}
})
}
else{
return callback(null, false);
}
columns = "";
sqlData = [];
},
function(err, results) {
//Code never reaches here, don't know why
if (err) {
return callback(err, false);
}
else{
return callback(null, true);
}
});
} // END
回答如下:
在数据库查询调用期间,成功查询时不会调用回调,因此导致代码永远不会到达最终回调。
您将需要在if (err) { return callback(err); }
之后添加另一个return语句,以让异步知道您的数据库查询已完成。
另外一点,according to the docs, async每个方法的最终回调都不会在其回调中调用结果。
当所有iteratee函数完成或发生错误时调用的回调。用(错误)调用。
因此,您不需要将值传递给iteratee函数中的回调语句。
修改您的代码以执行此操作,它将起作用。
conn.query(sqlQuery, sqlData, function (err, result) {
if (err) {
return callback(err);
}
return callback(null);
})
希望这可以帮助。