【问题标题】:nodejs express knex master detail record updatenodejs express knex主明细记录更新
【发布时间】:2018-03-20 18:43:25
【问题描述】:

我有主(工作簿)和子(工作簿数据集)。我正在尝试更新主记录并同时(插入或更新或删除)子记录。一切正常,只是它没有返回更新的子记录。我知道我在指定 'then' 时做错了,并且由于它始终是 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,但还是一样。任何帮助/指针都会有很大的帮助!提前致谢!

【问题讨论】:

  • 您使用的是哪个数据库?

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


【解决方案1】:

你需要一个return,在你有knex('workbookdataset').where('workbookid'的那一行

【讨论】:

  • 哇!有效。多么愚蠢。谢谢。 (我使用的是新 id,他们没有让我标记为答案)
【解决方案2】:

看看 knex documentation.returning 方法。它允许您从数据库中返回插入/更新/删除的记录。

另外,我建议您检查您的承诺链,以确保您在正确的位置返回正确的值。

附:这与问题无关,但如果您使用事务添加到您的查询 .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,...}, ...]
  })

【讨论】:

  • 是的,知道了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 2018-06-02
  • 2013-10-27
相关资源
最近更新 更多