Domande per il Colloquio di Junior Backend Developer (Node.js): Guida Completa

Milad Bonakdar
Autore
Padroneggia lo sviluppo backend con Node.js grazie a 35 domande essenziali per il colloquio, che coprono i fondamenti di JavaScript, la programmazione asincrona, Express.js, i database, le API, la sicurezza e altro ancora. Preparazione perfetta per i colloqui da junior backend developer.
Introduzione
Questa guida completa contiene 35 domande per il colloquio, accuratamente selezionate, che coprono i fondamenti dello sviluppo backend con Node.js. Queste sono le domande che gli sviluppatori backend junior incontrano effettivamente nei colloqui. Ogni domanda include una risposta approfondita, una valutazione della rarità e un livello di difficoltà basato sull'analisi di centinaia di colloqui reali di importanti aziende tecnologiche e startup.
Che tu ti stia preparando per il tuo primo ruolo backend o che tu stia passando dallo sviluppo frontend, questa guida copre tutto, dai fondamenti di JavaScript alla progettazione di API, alla gestione di database, alle migliori pratiche di sicurezza e alle strategie di deployment.
Fondamenti di JavaScript (8 domande)
1. Spiega la differenza tra var, let e const in JavaScript
Risposta:
var: Scope a livello di funzione, sollevata (hoisted) e inizializzata conundefined, può essere ri-dichiarata nello stesso scope, ampiamente deprecata nel codice modernolet: Scope a livello di blocco, sollevata ma rimane nella Temporal Dead Zone (TDZ) fino alla dichiarazione, non può essere ri-dichiarata nello stesso scope, può essere riassegnataconst: Scope a livello di blocco, sollevata ma in TDZ, deve essere inizializzata al momento della dichiarazione, non può essere riassegnata (ma il contenuto di oggetti/array può essere modificato)
Esempio:
Best practice: Usa const di default, let quando devi riassegnare, non usare mai var nel JavaScript moderno.
Rarità: Comune Difficoltà: Facile
2. Cosa sono le closure e fornisci un esempio pratico in Node.js?
Risposta: Una closure si verifica quando una funzione interna ha accesso alle variabili dello scope della sua funzione esterna (contenitore), anche dopo che la funzione esterna è stata restituita. La funzione interna "si chiude" su queste variabili.
Esempio pratico in Node.js:
Vantaggi:
- Privacy dei dati (secretKey non può essere accessibile direttamente)
- Fabbriche di funzioni
- Implementazione del pattern modulo
- Mantenimento dello stato nelle operazioni asincrone
Rarità: Comune Difficoltà: Media
3. Spiega la keyword this e come differisce nelle arrow function
Risposta: this si riferisce al contesto di esecuzione. Il suo valore dipende da COME viene chiamata la funzione.
Funzioni regolari:
Arrow function:
Differenza chiave: Le arrow function non hanno il proprio this - lo ereditano dallo scope contenitore.
Rarità: Comune Difficoltà: Media
4. Cosa sono le Promise e come differiscono dalle callback?
Risposta: Una Promise rappresenta il completamento (o il fallimento) eventuale di un'operazione asincrona.
Pattern callback (callback hell):
Pattern Promise:
Vantaggi:
- Evita la callback hell
- Migliore gestione degli errori con
.catch() - Operazioni concatenabili
- Possibilità di utilizzare
Promise.all()per operazioni parallele
Rarità: Comune Difficoltà: Facile-Media
5. Cosa sono async/await e come migliorano la leggibilità del codice?
Risposta: async/await è zucchero sintattico costruito sulle Promise che fa sembrare e comportare il codice asincrono in modo più simile al codice sincrono.
Esempio:
Punti chiave:
- La funzione
asyncrestituisce sempre una Promise awaitmette in pausa l'esecuzione finché la Promise non si risolve- Usa
try/catchper la gestione degli errori - Rende più chiare le operazioni sequenziali
Rarità: Comune Difficoltà: Media
6. Spiega il destructuring per oggetti e array
Risposta: Il destructuring estrae valori da array o proprietà da oggetti in variabili distinte.
Destructuring di array:
Destructuring di oggetti:
Parametri di funzione:
Rarità: Comune Difficoltà: Facile-Media
7. Cosa sono lo spread operator e i rest parameters?
Risposta:
Spread operator (...) - Espande gli iterabili:
Rest parameters (...) - Raccoglie più elementi:
Differenza chiave: Spread espande, rest raccoglie.
Rarità: Comune Difficoltà: Facile-Media
8. Spiega i metodi comuni degli array: map, filter, reduce, forEach
Risposta:
map - Trasforma ogni elemento, restituisce un nuovo array:
filter - Mantiene gli elementi che corrispondono alla condizione:
reduce - Riduce a un singolo valore:
forEach - Itera senza restituire un nuovo array:
Rarità: Comune Difficoltà: Facile
Fondamenti di Node.js (7 domande)
9. Cos'è Node.js e come differisce dai linguaggi server-side tradizionali?
Risposta: Node.js è un runtime JavaScript costruito sul motore JavaScript V8 di Chrome che consente a JavaScript di essere eseguito sul server-side.
Differenze chiave:
- Event loop single-threaded: Utilizza un modello I/O non bloccante vs. I/O bloccante multi-threaded
- Asincrono di default: Le operazioni non bloccano il thread principale
- JavaScript ovunque: Stesso linguaggio per frontend e backend
- Ecosistema NPM: Il più grande registro di pacchetti al mondo
- Esecuzione veloce: Il motore V8 compila JavaScript in codice macchina nativo
Quando usare Node.js:
- Applicazioni real-time (chat, gaming)
- Server API
- Microservizi
- Applicazioni di streaming di dati
- Applicazioni I/O-intensive
Quando NON usare:
- Task CPU-intensive (elaborazione di immagini, codifica video)
- Applicazioni che richiedono calcoli complessi
Rarità: Comune Difficoltà: Facile-Media
10. Spiega l'Event Loop in Node.js
Risposta: L'Event Loop è il meccanismo che consente a Node.js di eseguire operazioni I/O non bloccanti pur essendo single-threaded.
Come funziona:
- Call Stack: Esegue codice sincrono (LIFO)
- Node APIs: Gestisce operazioni asincrone (fs, http, timers)
- Callback Queue (Macrotasks): Contiene le callback delle Node APIs
- Microtask Queue: Contiene le callback delle Promise (priorità più alta)
- Event Loop: Sposta i task dalle code alla call stack quando la stack è vuota
Ordine di esecuzione:
Fasi dell'Event Loop:
- Timers (setTimeout, setInterval)
- Pending callbacks
- Idle, prepare
- Poll (recupera nuovi eventi I/O)
- Check (callback di setImmediate)
- Close callbacks
Rarità: Comune Difficoltà: Difficile
11. Qual è la differenza tra codice bloccante e non bloccante?
Risposta:
Codice bloccante - Interrompe l'esecuzione finché l'operazione non è completata:
Codice non bloccante - Continua l'esecuzione, gestisce il risultato tramite callback:
Perché il non bloccante è importante:
- Il server può gestire più richieste contemporaneamente
- Migliore utilizzo delle risorse
- Prestazioni migliorate per le operazioni I/O
- Scalabilità
Rarità: Comune Difficoltà: Facile-Media
12. Cosa sono i moduli di Node.js e come funziona il sistema dei moduli?
Risposta: Node.js utilizza il sistema dei moduli CommonJS (anche se i moduli ES sono supportati).
CommonJS (require/module.exports):
Moduli ES (import/export):
Tipi di modulo:
- Moduli core: Built-in (fs, http, path)
- Moduli locali: I tuoi file
- Moduli di terze parti: Installati tramite npm
Caching dei moduli: I moduli vengono memorizzati nella cache dopo il primo require, quindi i successivi require restituiscono la stessa istanza.
Rarità: Comune Difficoltà: Facile
13. Spiega la differenza tra process.nextTick() e setImmediate()
Risposta:
process.nextTick() - Esegue la callback nella fase corrente, prima di qualsiasi altra operazione asincrona:
setImmediate() - Esegue la callback nella prossima iterazione dell'event loop:
Ordine di priorità:
- Codice sincrono
- Callback di
process.nextTick() - Callback di Promise (microtask)
setTimeout(0)/setImmediate()(macrotask)
Casi d'uso:
nextTick: Assicura che la callback venga eseguita prima di altre operazioni asincronesetImmediate: Rimanda l'esecuzione alla prossima iterazione dell'event loop
Rarità: Non comune Difficoltà: Media-Difficile
14. Cos'è l'oggetto Global in Node.js?
Risposta: L'oggetto global in Node.js è simile all'oggetto window nei browser, ma si chiama global.
Proprietà globali:
Global comuni:
process- Informazioni e controllo del processoBuffer- Gestisce i dati binarisetTimeout,setInterval,clearTimeout,clearIntervalsetImmediate,clearImmediateconsole- Output della console
Nota: Nei moduli ES, __dirname e __filename non sono disponibili di default. Utilizza invece import.meta.url.
Rarità: Comune Difficoltà: Facile
15. Come gestisci gli errori nelle applicazioni Node.js?
Risposta: La gestione degli errori in Node.js può essere gestita attraverso diversi approcci:
1. Try-catch per codice sincrono:
2. Pattern di errore callback:
3. Gestione degli errori di Promise:
4. Async/await con try-catch:
5. Gestori di errori globali:
6. Middleware per la gestione degli errori in Express:
Rarità: Comune Difficoltà: Media
Express.js e Web Frameworks (6 domande)
16. Cos'è Express.js e quali sono le sue caratteristiche principali?
Risposta: Express.js è un framework per applicazioni web Node.js minimale e flessibile che fornisce un robusto set di funzionalità per la creazione di applicazioni web e mobile.
Caratteristiche principali:
- Routing: Definisci endpoint e metodi HTTP
- Middleware: Funzioni che vengono eseguite durante il ciclo richiesta-risposta
- Template engines: Renderizza HTML dinamico (EJS, Pug, Handlebars)
- Gestione degli errori: Middleware centralizzato per la gestione degli errori
- File statici: Serve asset statici
- Parsing JSON: Parsing del body integrato per dati JSON e URL-encoded
Esempio base:
Perché Express:
- Minimo e non vincolante
- Ampio ecosistema
- Facile da imparare
- Sistema di middleware flessibile
Rarità: Comune Difficoltà: Facile
17. Cosa sono i middleware in Express.js? Fornisci esempi.
Risposta: Le funzioni middleware sono funzioni che hanno accesso all'oggetto request (req), all'oggetto response (res) e alla funzione next nel ciclo richiesta-risposta dell'applicazione.
Tipi di middleware:
1. Middleware a livello di applicazione:
2. Middleware a livello di route:
3. Middleware per la gestione degli errori:
4. Middleware integrati:
5. Middleware di terze parti:
Esempio di middleware di autenticazione personalizzato:
Rarità: Comune Difficoltà: Media
18. Spiega il routing di Express e come organizzare le rotte
Risposta: Il routing si riferisce a come gli endpoint (URI) di un'applicazione rispondono alle richieste del client.
Routing di base:
Parametri di route:
Parametri di query:
Organizzare le rotte con Express Router:
Rarità: Comune Difficoltà: Facile-Media
19. Come gestisci l'upload di file in Express?
Risposta: L'upload di file può essere gestito utilizzando middleware come multer.
Upload di file di base:
File multipli:
Configurazione personalizzata dello storage:
Rarità: Comune Difficoltà: Media
20. Cos'è CORS e come lo gestisci in Express?
Risposta: CORS (Cross-Origin Resource Sharing) è una funzionalità di sicurezza che consente o limita le pagine web dall'effettuare richieste a un dominio diverso da quello che serve la pagina web.
Problema: I browser bloccano le richieste da http://localhost:3000 a http://localhost:4000 di default (origini diverse).
Soluzione con il middleware cors:
Header CORS manuali:
Rarità: Comune Difficoltà: Facile-Media
21. Come strutturi un'applicazione Express.js di grandi dimensioni?
Risposta: Organizza il codice in moduli e cartelle logiche per la manutenibilità.
Struttura raccomandata:
Esempio di separazione delle preoccupazioni:
Controller (gestisce HTTP):
Service (logica di business):
Route:
Setup dell'app:
Rarità: Comune Difficoltà: Media
Concetti di Database (5 domande)
22. Qual è la differenza tra database SQL e NoSQL?
Risposta:
Database SQL (Relazionali):
- Dati strutturati con tabelle, righe, colonne
- Lo schema deve essere definito prima dell'uso
- Conformità ACID (Atomicità, Coerenza, Isolamento, Durabilità)
- Esempi: PostgreSQL, MySQL, SQLite
- Ottimo per: Query complesse, transazioni, dati strutturati
Database NoSQL:
- Schema flessibile o schema-less
- Vari modelli di dati (documento, chiave-valore, grafo, colonna)
- Scalabilità orizzontale
- Esempi: MongoDB, Redis, Cassandra
- Ottimo per: Applicazioni su larga scala, schemi flessibili, sviluppo rapido
Comparazione:
Quando usare SQL:
- Query e relazioni complesse
- Conformità ACID richiesta
- Dati strutturati
- Transazioni finanziarie
Quando usare NoSQL:
- Sviluppo rapido
- Dati su larga scala
- Necessità di schema flessibile
- Query semplici
Rarità: Comune Difficoltà: Facile-Media
23. Come ti connetti a un database in Node.js? (Esempio MongoDB)
Risposta: Utilizzando MongoDB con Mongoose come esempio:
Connessione di base:
Con variabili d'ambiente:
Eventi di connessione:
Definizione di un modello:



