我有一个应用程序,有一个地址对象和一个与该应用程序相关联的人员列表。
{
field1: value,
field2: value,
address: {
street: value,
apt: value,
city: value
},
owners: [
{name: value, etc.},
{name: value, etc.}
]
}
我将所有者传递给一个函数,该函数在所有者上循环,并将每个查询的信息传递给异步函数:
async function insertAllOwners(appId, owners) {
for (var i = 0, len = owners.length; i < len; i++) {
console.log("insert owner", i);
await insertOwner(appId, owners[i]);
}
}
这里调用的函数将查询转换为promise:
function insertOwner(appId, owner) {
let sqlOwner = 'insert into ...';
return new Promise( ( resolve, reject ) => {
mySqlClient.query(sqlOwner, [appId, owner.memberType ...], (err, rows) => {
if ( err )
return reject( err );
console.log("rows:", rows);
resolve( rows );
} );
} );
}
地址插入嵌套在应用程序插入中,然后调用所有者插入循环的代码嵌套在地址插入中。循环所有者插入函数在这里调用:
if(app.owners) {
/* insert owners, then commit. else, just commit.*/
insertAllOwners(appId, app.owners).then( result => {
mySqlClient.commit(function(err, result) {
if (err) {
console.error("ERROR DURING COMMIT:", err);
mySqlClient.rollback(function() {
throw err;
});
}
else {
console.log("commit:",result);
}
});
});
}
输出看起来很完美,但实际上并没有提交任何内容(没有显示新行(。有什么建议吗?日志输出如下:
OkPacket {
fieldCount: 0,
affectedRows: 1,
insertId: 0,
serverStatus: 1,
warningCount: 1,
message: '',
protocol41: true,
changedRows: 0
}
address result:
OkPacket {
fieldCount: 0,
affectedRows: 1,
insertId: 35,
serverStatus: 1,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0
}
insert owner 0
rows:
OkPacket {
fieldCount: 0,
affectedRows: 1,
insertId: 70,
serverStatus: 1,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0
}
...
insert owner 4
rows:
OkPacket {
fieldCount: 0,
affectedRows: 1,
insertId: 74,
serverStatus: 1,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0
}
commit:
OkPacket {
fieldCount: 0,
affectedRows: 0,
insertId: 0,
serverStatus: 0,
warningCount: 0,
message: '',
protocol41: true,
changedRows: 0
}
首先,这不是执行查询的好方法。
您正在做的是运行for循环,每个循环执行每个查询。但是通过这种方式,您可以向mysql加载。而且执行API需要更长的时间。
我建议这样做。
In for loop:
for (var i = 0, len = owners.length; i < len; i++) {
inserData.push(owners[i]); // Add all data in to array ...
}
之后对所有数据执行查询一次。
connection.query("INSERT INTO TABLE (columns) VLAUES ? " , insertData)...