Costruire un backend per la gestione dei progetti
Sto sviluppando uno strumento collaborativo di gestione dei progetti per il mio tirocinio presso CodeAlpha.
Funziona come una versione semplificata di Trello o Asana. Gli utenti creano progetti, invitano membri e spostano i task tra le bacheche. Utilizzo Express.js, Prisma e Socket.io per gestirlo.
Ecco le lezioni tecniche che ho imparato durante lo sviluppo del backend.
Gestione delle relazioni tra i dati
Utenti e progetti hanno una relazione many-to-many. Utilizzo una tabella ProjectMember per collegarli. Questa tabella memorizza dati aggiuntivi come il ruolo dell'utente.
Ho aggiunto un vincolo di unicità a questa tabella. Ciò garantisce che un utente compaia una sola volta per progetto. Crea inoltre una chiave composta per ricerche rapide.
Per la bacheca Kanban, ho mantenuto le cose semplici. Lo stato di un task è definito dalla bacheca a cui appartiene. Spostare un task da "To Do" a "Done" è solo questione di aggiornare il suo board ID.
Errori di architettura
Ho imparato una lezione difficile sulle connessioni al database. Non creare un nuovo PrismaClient in ogni file delle rotte. Questo crea troppe connessioni e manda in crash l'app.
Invece, crea un'unica istanza condivisa in un singolo file. Importa la stessa istanza in ogni rotta. Questo mantiene stabile il tuo connection pool.
Autorizzazione e sicurezza
Utilizzo un middleware protect per proteggere le rotte. Controlla il JWT nell'header Authorization.
Utilizzo l'optional chaining quando leggo gli header. Questo evita che l'app vada in crash se un header è mancante.
Per questo progetto, utilizzo un access token con validità di 7 giorni. Mentre le applicazioni in produzione utilizzano token a breve scadenza e refresh token, un token a lunga durata funziona bene per questo specifico ambito.
Integrità dei dati con le transazioni
La creazione di un progetto richiede tre passaggi:
- Crea il record del progetto
- Assegna il proprietario
- Crea le bacheche predefinite
Se un passaggio fallisce, i dati rischiano di corrompersi. Utilizzo prisma.$transaction per racchiudere questi passaggi. Se una parte fallisce, l'intero processo subisce un rollback. Questo mantiene il database pulito.
Errori logici comuni
Mi sono imbattuto in due bug comuni:
Array di relazioni: Quando includi le relazioni in una query, Prisma restituisce un array. Non è possibile accedere direttamente a una proprietà sulla relazione. Devi prima selezionare il primo elemento dell'array.
Ordine delle rotte: Express associa le rotte dall'alto verso il basso. Se inserisci una rotta con un parametro prima di una rotta specifica, Express assocerà quella sbagliata. Posiziona sempre le rotte specifiche sopra quelle parametrizzate.
Questi pattern backend fanno ora parte del mio workflow.