Story of my life:
Pisząc backend w javascripcie pod node napotkałem problem związany z operacjami na obiekcie w bazie danych (SQL). Przykładowo by zmodyfikować wiek użytkownika, używałem metody obiektu bazy danych db.modifyUserAge(userId, age)
. Przed wykonaniem takiej operacji musiałem upewnić się, że użytkownik istnieje, de facto pobierając jego informacje, co skłoniło mnie do zmiany podejścia - zamiast wywoływać metody bazy danych, zacząłem używać modelu użytkownika:
const user = await db.getUser(userId);
await user.modifyAge(age, db);
...co przekształciło się w...
const user = await User.find(userId, db);
await user.modifyAge(age, db)
Chciałbym pozbyć się brzydkiego db
przy każdej operacji, by interfejs wyglądał tak:
const user = await User.find(userId);
await user.modifyAge(age);
By to osiągnąć, dodałem singleton połączenia do modelu:
// User.js
const db = require('./dbConenction');
class User {
static async find(id) {
return new User(db.findUser(id));
}
async modifyAge(age) {
return db.modifyUserAge(this.id, age);
}
}
module.exports = User;
Dwa pytania odnośnie ostatniej wstawki:
- Czy rozwiązanie polegające na wrzuceniu singletona połączenia bazy danych do modelu jest odpowiednie? Jeśli nie, jakie rozwiązanie polecacie, pod jakimi hasłami szukać?
- Czy zaznaczanie funkcji już zwracającej
Promise
keywordemasync
jest prawidłowe?