nodejs表示knex主详细记录更新

时间:2018-03-20 18:43:26

标签: node.js express master-detail knex.js yield-return

我有大师(练习册)&儿童(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,但仍然相同。任何帮助/指针都将是一个很大的帮助!提前谢谢!

2 个答案:

答案 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,...}, ...]
  })