我有大师(练习册)&儿童(WorkBookDataset)。我正在尝试更新master并同时(插入或更新或删除)子记录。一切正常,但它没有返回更新的子记录。我知道我在指定'然后'时做错了,因为它始终是asyc操作,结果已经在子更新完成之前返回。
var Promise = require('bluebird');
return knex.transaction(function(trx) {
return knex('workbook').where('workbookid',workbook.workbookid).andWhere('userid', workbook.userid)
.update(workbook)
.then(function(updatedrecords) {
return Promise.map(datasets, function(dataset) {
if(dataset.workbookdatasetid && dataset.workbookdatasetid == -1){
//remove
return knex('workbookdataset').where('workbookid',workbook.workbookid).andWhere('datasetid', dataset.datasetid)
.delete();
} else {
dataset.workbookid = workbook.workbookid;
knex('workbookdataset').where('workbookid',workbook.workbookid).andWhere('datasetid', dataset.datasetid)
.then(function(alreadyds) {
if(alreadyds.length == 1){
//update
return knex('workbookdataset').where('workbookid',workbook.workbookid).andWhere('datasetid', dataset.datasetid)
.update(dataset)
}else{
//insert
if(dataset.workbookdatasetid){
delete dataset.workbookdatasetid;
}
return knex('workbookdataset')
.insert(dataset)
}
})
}
});
})
})
.then(function(updatedrecords) {
return getWorkBook(workbook.userid, workbook.workbookid); //this returns updated workbook information, but not updated workbookdataset information
});

我尝试将then()添加到Promise,但仍然相同。任何帮助/指针都将是一个很大的帮助!提前谢谢!
答案 0 :(得分:1)
您需要在return
knex('workbookdataset').where('workbookid'
答案 1 :(得分:1)
查看来自knex documentation的.returning
方法。它允许您从数据库返回插入/更新/删除的记录。
此外,我建议您检查您的保修链,以确保您在正确的位置返回正确的值。
P.S。这与问题无关,但是如果您使用事务,请添加到您的查询.transacting(trx)
,以便在一个事务中实际运行它们而不是单独运行。
knex('workbook')
.where('workbookid',workbook.workbookid)
.andWhere('userid', workbook.userid)
.update(workbook)
.returning('*')
.transacting(trx)
.then(data => {
console.log(data) // => [{id: 1, workbookid: 1, userid: 981,...}, ...]
})