Operacje na modelu z bazy danych

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:

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:

  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?
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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1