【发布时间】:2018-10-29 02:36:42
【问题描述】:
我有一个应用程序,其中包含一个地址对象,以及与该应用程序关联的人员列表。
{
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]);
}
}
这里调用的函数将查询变成了一个承诺:
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
}
【问题讨论】:
标签: javascript mysql node.js promise