Я видел задачи pg-prom и 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 (имя пользователя) и 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);
}
Итак, как я должен рефакторировать, сохраняя UserModel и EventModel отдельно
Рекомендуемый подход к созданию большого приложения базы данных с pg-обещанием хорошо изложен в pg-prom-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);
}
А затем передайте ему дополнительный контекст задачи/транзакции, когда он доступен.