【问题标题】:pg-promise Chaining Queries for Task and Transactions用于任务和事务的 pg-promise 链式查询
【发布时间】:2017-11-12 19:37:48
【问题描述】:

我已经看到 pg-promise 任务和 tx 重用我们可以使用的相同连接

db.task(t => {
return t.one('SELECT id FROM Users WHERE name = $1', 'John')
    .then(user => {
        return t.any('SELECT * from Events WHERE userId = $1', user.id);
    });}).then(events => {// success
 }).catch(error => {
// error
});

但是如果我有两个不同的文件,例如UsersModel.getUser(username) 和 EvenModel.getUserEvent(userId)。有什么方法可以传递事务或任务对象。

谢谢

为了进一步详细说明,我有一个文件 LoginController.js

function login(){
UsersModel.getUser(username).then((response)=>{
    return EventModel.getEvent(response.ID);
}).then((result)=>{
    res.send(result);
})

}

如果我们看到 getUser 的实现是这样的

export function getUser(username){

return db.any('SELECT id FROM Users WHERE name = $1', username);
}

那么我应该如何重构保持UsersModel和EventModel分开

【问题讨论】:

  • 在 Node.js 中,源文件的组织方式无关紧要,它不会影响对其他库的使用。那么你的问题到底是什么?
  • 对不起,我可能不清楚,但基本上 UsersModelgetUser 有查询 select id from users.. 并且 EventModel 有自己的查询我在两个函数中都使用了 db.any 如何将任务传递给那些模型
  • 一方面,如果您想传入任务上下文,为什么不直接传入t 变量,然后在模型中使用它呢?如果您询问组织数据模型的最佳方式,请查看pg-promise-demo
  • 我已经编辑了问题请再看一遍

标签: javascript node.js postgresql pg-promise


【解决方案1】:

使用pg-promise 构建大型数据库应用程序的推荐方法在pg-promise-demo 中有详细说明。

但是,如果您想保留传统的数据模型,那么为了使模型方法在任务和事务中正常工作,您应该从这里更新您的方法:

function getUser(username) {
    return db.oneOrNone('SELECT id FROM Users WHERE name = $1', username);
}

到这里:

function getUser(username, t) {
    t = t || db;
    return t.oneOrNone('SELECT id FROM Users WHERE name = $1', username);
}

然后在可用时将可选的任务/事务上下文传递给它。

【讨论】:

  • 感谢我看过 pg-demo,但它的用户和产品看不到交易或更复杂的场景。是的,当然,但我无法得到它。谢谢你的回答
  • @dev123 是的,我一直在考虑扩展它以包含此类示例。基本上,在该架构中,当在任务/事务中时,您会自动访问所有存储库方法,这就是它的美妙之处。
  • @dev123 它没有回答你的问题吗?你没有接受答案。
  • 能否请您提及传递交易的控制器逻辑
  • @dev123 我不确定它如何适合您的控制器,这取决于您。同时,我更新了pg-promise-demo here,以展示正确使用任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2020-06-13
  • 2020-01-17
  • 2016-10-31
  • 1970-01-01
  • 2017-05-30
相关资源
最近更新 更多