🎁 Registrati ora e ottieni fino a 30 minuti gratuiti di IA online. Nessuna carta di credito richiesta.

Domande e risposte per colloqui su Node.js: Event Loop, Async, API e Scalabilità

September 3, 2026
Domande per colloqui su Node.js con risposte e codice su event loop, pattern asincroni, Express, stream, memory leak, sicurezza e scalabilità.
Domande e risposte per colloqui su Node.js: Event Loop, Async, API e Scalabilità
domande per colloqui su node js
domande e risposte per colloqui su nodejs
colloquio event loop node
domande per colloqui su express

I colloqui su Node.js iniziano con l'event loop e il codice asincrono, per poi passare ad API, gestione degli errori, stream, prestazioni e sicurezza. Il motivo più comune per cui i candidati inciampano è descrivere l'event loop come se fosse magia. Una spiegazione chiara di cosa viene eseguito dove, e di cosa blocca, è quello che gli intervistatori si aspettano di sentire.

Di seguito trovi 24 domande con risposte. Gli esempi di codice sono brevi, così puoi riscriverli a memoria.

Event loop e asincronia

1. Cos'è Node.js?

Un runtime JavaScript basato sul motore V8 di Chrome che viene eseguito al di fuori del browser. Usa un event loop a singolo thread per JavaScript con I/O non bloccante, il che lo rende adatto a gestire molte connessioni che passano la maggior parte del tempo in attesa.

2. Come funziona l'event loop?

Il codice JavaScript viene eseguito su un solo thread. Quando avvia un'operazione di I/O, come leggere un file o fare una richiesta, Node la delega al sistema o a un pool di thread e prosegue. Quando l'operazione termina, la sua callback viene messa in coda e l'event loop la esegue quando lo stack delle chiamate è vuoto. Il loop attraversa diverse fasi: timer, callback in sospeso, poll (I/O), check (setImmediate) e callback di chiusura.

3. Qual è l'ordine di process.nextTick, Promise, setTimeout e setImmediate?

console.log('1 sync');
setTimeout(() => console.log('4 timeout'), 0);
setImmediate(() => console.log('5 immediate'));
Promise.resolve().then(() => console.log('3 promise'));
process.nextTick(() => console.log('2 nextTick'));

Il codice sincrono viene eseguito per primo. Poi le callback di process.nextTick, poi le microtask delle promise, poi le fasi del loop. setTimeout(0) rispetto a setImmediate può variare nel modulo principale, ma all'interno di una callback di I/O setImmediate viene sempre eseguito per primo. Preparati a spiegare, non solo a recitare.

4. Cosa significa "bloccare l'event loop" e come si evita?

Un'attività sincrona lunga, come il parsing di un JSON enorme, un ciclo pesante o fs.readFileSync in un handler di richiesta, blocca tutte le altre richieste finché non termina. Per evitarlo, usa API asincrone, suddividi il lavoro in blocchi oppure sposta il lavoro ad alto carico di CPU su worker thread o su un altro processo.

5. Callback, promise e async/await: quali sono le differenze?

Le callback sono lo stile originale e possono annidarsi in profondità. Le promise rappresentano un valore futuro e si concatenano con then. async/await è una sintassi costruita sopra le promise che si legge come codice sincrono e funziona con try/catch.

6. Come si eseguono attività asincrone in parallelo?

const [user, orders] = await Promise.all([getUser(id), getOrders(id)]);

Promise.all viene rifiutata se una qualsiasi fallisce. Promise.allSettled attende tutte e riporta ogni risultato. Promise.race restituisce la prima che si risolve o si rifiuta. Non usare await dentro un ciclo quando le chiamate sono indipendenti.

7. Qual è la differenza tra worker thread, processi figli e cluster?

I worker thread eseguono JavaScript in thread separati all'interno di un unico processo e possono condividere la memoria, il che li rende adatti a lavori ad alto carico di CPU. I processi figli avviano programmi separati. Il modulo cluster crea diverse copie dell'applicazione, una per core, condividendo una porta, così puoi sfruttare tutte le CPU per gestire le richieste.

Moduli e strumenti

8. CommonJS o ES modules?

CommonJS usa require e module.exports e carica in modo sincrono. Gli ES modules usano import e export, sono lo standard in JavaScript e supportano il top-level await. Node supporta entrambi, scelti in base all'estensione del file o al campo type in package.json.

9. Cosa contiene package.json e qual è la differenza tra dependencies e devDependencies?

Contiene metadati, script e dipendenze. Le dependencies servono a runtime, mentre le devDependencies solo per lo sviluppo e i test. Un file di lock registra le versioni esatte, così le installazioni sono riproducibili.

10. Come si gestisce la configurazione dell'ambiente?

Usa variabili d'ambiente, lette tramite process.env, con un modulo di configurazione validato. Tieni i segreti fuori dal repository e usa un gestore di segreti in produzione.

API ed Express

11. Cos'è il middleware in Express?

Una funzione con accesso alla richiesta, alla risposta e a next. Il middleware viene eseguito in ordine e può modificare la richiesta, terminare la risposta o passare il controllo. Gli usi tipici sono logging, parsing del body, autenticazione e gestione degli errori.

app.use((req, res, next) => {
  console.log(req.method, req.url);
  next();
});

12. Come si gestiscono gli errori in un'app Express?

Cattura gli errori negli handler asincroni e passali a next(err), poi usa un middleware di gestione degli errori con quattro argomenti (err, req, res, next) per inviare una risposta coerente. In Express 5, le promise rifiutate dagli handler vengono inoltrate automaticamente. Per le eccezioni non catturate e le rejection non gestite, registra l'errore e riavvia il processo invece di continuare in uno stato sconosciuto.

13. Come progetteresti un endpoint REST per creare un ordine?

Valida l'input, autentica l'utente, verifica i permessi, crea l'ordine all'interno di una transazione del database, restituisci 201 con la nuova risorsa e la sua posizione, gestisci i duplicati con una chiave di idempotenza e restituisci errori chiari con i codici di stato appropriati.

14. Come si autenticano gli utenti?

Con sessioni basate su cookie oppure con token come i JWT. Esegui l'hash delle password con un algoritmo lento come bcrypt o argon2. Con i JWT, mantieni una scadenza breve, usa con attenzione i refresh token e non memorizzare dati sensibili nel token.

Stream, file e prestazioni

15. Cosa sono gli stream e perché usarli?

Gli stream elaborano i dati a blocchi invece di caricarli tutti in memoria. I tipi sono readable, writable, duplex e transform. Usali per file di grandi dimensioni, upload e download.

const fs = require('node:fs');
const { pipeline } = require('node:stream/promises');
const zlib = require('node:zlib');
await pipeline(fs.createReadStream('in.log'), zlib.createGzip(), fs.createWriteStream('in.log.gz'));

16. Cos'è la backpressure?

Quando uno stream writable non riesce a stare al passo con uno readable, segnala alla sorgente di rallentare. pipeline e pipe gestiscono questo aspetto per te. Se scrivi manualmente, controlla il valore di ritorno di write() e attendi l'evento drain.

17. Come si individua un memory leak?

Monitora la memoria nel tempo, acquisisci heap snapshot (Chrome DevTools o --inspect) e confrontali per vedere quali oggetti crescono. Le cause più comuni sono cache globali che non scadono mai, listener di eventi che non vengono rimossi e closure che trattengono oggetti di grandi dimensioni.

18. Come si scala un'applicazione Node.js?

Esegui più processi con il modulo cluster o un process manager, mettili dietro un load balancer, mantieni l'applicazione stateless spostando le sessioni su Redis o su un database, usa la cache e scala orizzontalmente con i container. Sposta il lavoro pesante per la CPU su worker o servizi separati.

19. Come si fa il profiling di un endpoint lento?

Misura prima con log e timing, poi usa --prof o --cpu-prof, oppure uno strumento per flame graph, per trovare le funzioni più calde. Controlla le query al database, perché la lentezza è più spesso lì che nel JavaScript.

Sicurezza e affidabilità

20. Quali sono i problemi di sicurezza più comuni in Node.js?

Injection (SQL, NoSQL, comandi), cross-site scripting, autenticazione debole, dipendenze vulnerabili, segreti nel codice, rate limiting assente e deserializzazione non sicura. Mitiga con la validazione dell'input, query parametrizzate, helmet, audit delle dipendenze (npm audit) e il principio del minimo privilegio.

21. Come si esegue uno shutdown controllato?

Su SIGTERM, smetti di accettare nuove connessioni, lascia terminare le richieste in corso, chiudi le connessioni al database e poi esci, con un timeout come fallback.

process.on('SIGTERM', () => {
  server.close(() => process.exit(0));
});

22. Come si testa il codice Node.js?

Test unitari con un runner come node:test integrato, Jest o Vitest, facendo il mock delle chiamate esterne. Test di integrazione su un database di test e test a livello HTTP con uno strumento come Supertest. Mantieni i test veloci e indipendenti.

Progettazione e scenari

23. La tua API è lenta sotto carico. Come indaghi?

Controlla le metriche di latenza e CPU. Se la CPU è alta su un solo core, cerca codice bloccante o elaborazioni JSON pesanti. Se la CPU è bassa e la latenza è alta, guarda all'attesa del database o di altri servizi. Poi aggiungi cache, indici, connection pooling o batching, e testa di nuovo sotto carico.

24. Come costruiresti un endpoint di upload per file di grandi dimensioni?

Trasmetti l'upload direttamente allo storage, ad esempio object storage con un pre-signed URL, invece di bufferizzarlo in memoria. Imposta limiti di dimensione, valida il tipo, esegui la scansione se necessario e processa in seguito con un job in background.

Come prepararsi

Scrivi una piccola API con autenticazione, un database e una route di upload, poi fai il profiling con uno strumento di load testing e risolvi un problema. Esercitati a disegnare l'event loop e a spiegare l'output di un piccolo script come quello qui sopra. Preparati un episodio reale sul debug di un problema di prestazioni o affidabilità. Per i colloqui di coding, consulta la nostra guida all'assistente per colloqui di coding, e per il design, la guida al system design.

Pronuncia le tue risposte ad alta voce e rileggi la trascrizione per individuare i punti in cui hai usato un termine senza spiegarlo. Segui le regole del datore di lavoro sugli strumenti di AI in qualsiasi colloquio dal vivo.

Esercitati con le risposte ai colloqui su Node.js con YesToTheOffer

Fai un colloquio tecnico simulato, spiega l'event loop ad alta voce e rivedi la trascrizione in seguito. 30 minuti gratuiti, senza abbonamento.

iOS & Android — In arrivo
Vedi i prezzi