在knexjs中使用事务

时间:2018-08-01 13:47:29

标签: database knex.js

我正在使用knexjs,我想从一个表中获取数据并使其分支到另一个表中(idk如何很好地解释它),例如我有这些数据库

用户

id | name | email      | stories |
1  | lala | lala@gmail |    1    |

故事

id | entries | title | description |
1  |    1    |  haha |    foo      |

因此故事和条目是匹配的,每次添加新故事时,它都与条目相同,例如:

用户

id | name | email      | stories |
1  | lala | lala@gmail |    2    |

故事

id | entries | title | description |
1  |    1    |  haha |    foo      |
2  |    2    |  booo |    hoo      |

我试图做到这些

app.post('/new-story', (req, res) => {
    const { title, category, description, mature, id} = req.body;
    const stories = db.select('stories').from('users');
    db.transaction( trx => {
        trx.insert({
            stories: stories
        })
        .into('users')
        .returning('stories')
        .then( entriesBook => {

            return trx('story')
                .returning('*')
                .insert({
                    entries: entriesBook[0],
                    title: title,
                    category: category,
                    description: description,
                    mature: mature
                })
                .then( story => {
                    res.json(story[0]);
                })
        })
        .then( trx.commit)
        .catch( trx.rollback)
    })
    .catch( err => res.status(400).json('unable to create story'))
})

有人知道更好的方法来解决这些问题吗?

1 个答案:

答案 0 :(得分:0)

原则上,您的代码应该或多或少地执行您想做的事情。您正在以正确的方式使用事务,因此只需要调试代码并查找错误。

至少这看起来可疑:

const stories = db.select('stories').from('users');
...

trx.insert({
  stories: stories
})

在SQL中,它看起来像(没有检查将输出什么):

insert into table (stories) values (select "stories" from users);