我已经看过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)。有没有办法可以传递事务或任务对象。
感谢
进一步详细说明我有一个File 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分开
答案 0 :(得分:0)
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);
}
然后在可用时传递可选的任务/事务上下文。