gpt4 book ai didi

javascript - 让 Knex.js 事务与 ES7 async/await 一起使用

转载 作者:行者123 更新时间:2023-12-02 23:00:31 26 4
gpt4 key购买 nike

我正在尝试将 ES7 的 async/await 与 knex.js transactions. 结合起来

虽然我可以轻松地使用非事务性代码,但我正在努力使用上述异步/等待结构使事务正常工作。

我正在使用this module to simulate async/await

这是我目前拥有的:

非事务版本:

工作正常,但不是事务性的

app.js

// assume `db` is a knex instance

app.post("/user", async((req, res) => {
const data = {
idUser: 1,
name: "FooBar"
}

try {
const result = await(user.insert(db, data));
res.json(result);
} catch (err) {
res.status(500).json(err);
}
}));

用户.js

insert: async (function(db, data) {
// there's no need for this extra call but I'm including it
// to see example of deeper call stacks if this is answered

const idUser = await(this.insertData(db, data));
return {
idUser: idUser
}
}),

insertData: async(function(db, data) {
// if any of the following 2 fails I should be rolling back

const id = await(this.setId(db, idCustomer, data));
const idCustomer = await(this.setData(db, id, data));

return {
idCustomer: idCustomer
}
}),

// DB Functions (wrapped in Promises)

setId: function(db, data) {
return new Promise(function (resolve, reject) {
db.insert(data)
.into("ids")
.then((result) => resolve(result)
.catch((err) => reject(err));
});
},

setData: function(db, id, data) {
data.id = id;

return new Promise(function (resolve, reject) {
db.insert(data)
.into("customers")
.then((result) => resolve(result)
.catch((err) => reject(err));
});
}

尝试使其具有事务性

用户.js

// Start transaction from this call

insert: async (function(db, data) {
const trx = await(knex.transaction());
const idCustomer = await(user.insertData(trx, data));

return {
idCustomer: idCustomer
}
}),

似乎 await(knex.transaction()) 返回此错误:

[TypeError:容器不是函数]

最佳答案

我在任何地方都找不到可靠的答案(通过回滚和提交),所以这是我的解决方案。

首先,您需要“Promisify”knex.transaction 函数。有一些库可以实现这一点,但为了一个简单的例子,我这​​样做了:

const promisify = (fn) => new Promise((resolve, reject) => fn(resolve));

此示例创建博客文章和评论,如果其中一个出现错误,则回滚两者。

const trx = await promisify(db.transaction);

try {
const postId = await trx('blog_posts')
.insert({ title, body })
.returning('id'); // returns an array of ids

const commentId = await trx('comments')
.insert({ post_id: postId[0], message })
.returning('id');

await trx.commit();
} catch (e) {
await trx.rollback();
}

关于javascript - 让 Knex.js 事务与 ES7 async/await 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40580674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com