Domande colloquio Node.js per backend junior

Milad Bonakdar
Autore
Esercitati con 35 domande da colloquio per backend junior Node.js su JavaScript, codice asincrono, event loop, Express, API REST, database, sicurezza, test e debug.
Introduzione
Usa queste 35 domande da colloquio per backend junior con Node.js per verificare se sai spiegare i fondamenti che vengono spesso valutati: scope e codice asincrono in JavaScript, event loop di Node.js, middleware Express, API REST, database, sicurezza, test e debug.
Per ogni domanda, prova prima una risposta breve a voce alta e poi collegala a un piccolo progetto o a un’API che hai costruito. Una buona risposta junior di solito è semplice: definire il concetto, spiegare il compromesso e fare un esempio realistico in Node.js. Le etichette di rarità e difficoltà sono indicatori per la preparazione, non una garanzia sulle domande di ogni azienda.
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:


