Operacje na modelu z bazy danych

Operacje na modelu z bazy danych
Zielony Kret
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:1
0

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:

Kopiuj
const user = await db.getUser(userId);
await user.modifyAge(age, db);

...co przekształciło się w...

Kopiuj
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:

Kopiuj
const user = await User.find(userId);
await user.modifyAge(age);

By to osiągnąć, dodałem singleton połączenia do modelu:

Kopiuj
// 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:

  1. 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ć?
  2. Czy zaznaczanie funkcji już zwracającej Promise keywordem async jest prawidłowe?
edytowany 3x, ostatnio: Zielony Kret
Prav
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 6 lat
  • Postów:25
0
  1. Może zamiast przekazywać bazy do modelu, przekazuj model do bazy: db.save(user)?
  2. async poprawia czytelność. Od strony wydajności myślę, że V8 sobie z ewentualnym narzutem poradzi.
edytowany 2x, ostatnio: Prav

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.