È uscito il Corso Java Completo
Torna al blog

Cos'è Fastify e quando conviene rispetto a Express

Come funziona Fastify: schemi JSON per validazione e serializzazione, plugin con incapsulamento, e quando la velocità in più conta davvero.

Edoardo Midali

Edoardo Midali

Developer · Content Creator

6 min di lettura

Fastify viene presentato quasi sempre con un numero: è più veloce di Express. Vero, ma è anche il motivo meno interessante per sceglierlo — e per la maggior parte delle applicazioni quel vantaggio è irrilevante, perché il collo di bottiglia è il database. Le ragioni serie sono altre e si notano scrivendo il codice. In questo articolo trovi come funziona, cosa lo distingue davvero e quando conviene.

Cos'è

Fastify è un framework web per Node costruito attorno a due idee: gli schemi JSON per validare e serializzare i dati, e un sistema di plugin che incapsula ciò che registri.

L'API somiglia a Express quanto basta perché chi lo conosce si orienti subito, ma le fondamenta sono diverse: supporto nativo alle promesse, TypeScript di prima classe, e un modo strutturato di comporre le funzionalità.

Un server minimo:

import Fastify from "fastify";

const app = Fastify({ logger: true });

app.get("/ordini/:id", async (request, reply) => {
  const ordine = await trovaOrdine(request.params.id);
  if (!ordine) return reply.code(404).send({ errore: "Non trovato" });
  return ordine;
});

await app.listen({ port: 3000 });

Due differenze già visibili: restituire un valore da una funzione asincrona equivale a inviarlo — niente res.json() dimenticato — e il logger è integrato, non una libreria da aggiungere.

Gli schemi: la caratteristica che conta

Questa è la parte che vale la pena capire, perché non ha equivalenti diretti altrove.

Dichiari la forma dei dati in entrata e in uscita:

const schemaOrdine = {
  body: {
    type: "object",
    required: ["prodotto", "quantita"],
    properties: {
      prodotto: { type: "string" },
      quantita: { type: "integer", minimum: 1 },
    },
  },
  response: {
    200: {
      type: "object",
      properties: {
        id: { type: "string" },
        totale: { type: "number" },
      },
    },
  },
};

app.post("/ordini", { schema: schemaOrdine }, async (request) => {
  return creaOrdine(request.body);
});

Fastify ne ricava tre cose in un colpo solo:

La validazione in ingresso. Una richiesta malformata viene respinta prima del tuo codice, con un errore già formattato. Niente controlli manuali all'inizio di ogni gestore.

La serializzazione in uscita, molto più rapida. Sapendo in anticipo la forma della risposta, Fastify genera una funzione specializzata invece di usare la conversione generica. È qui che nasce buona parte del vantaggio di velocità — non da ottimizzazioni misteriose.

Un filtro su cosa esce. I campi non dichiarati nello schema di risposta vengono rimossi. È una protezione concreta: una password o un token aggiunti per errore all'oggetto utente non finiscono nella risposta. Un beneficio di sicurezza che arriva gratis — il contesto è in come rendere sicuro un sito.

Lo stesso schema genera la documentazione dell'API, che resta allineata al codice invece di invecchiare in un file a parte.

I plugin e l'incapsulamento

Il secondo concetto distintivo, e quello che sostituisce i middleware globali di Express.

Tutto è un plugin: rotte, connessioni al database, autenticazione. E ciò che registri dentro un plugin vive solo lì dentro, insieme ai suoi figli.

app.register(async function areaPubblica(app) {
  app.get("/prodotti", async () => listaProdotti());
});

app.register(async function areaPrivata(app) {
  app.addHook("onRequest", verificaToken);   // vale solo qui
  app.get("/ordini", async () => listaOrdini());
});

Il controllo dell'autenticazione si applica solo al secondo gruppo. Non c'è un ordine globale da ricordare, e non puoi esporre per sbaglio una rotta privata mettendola nel punto sbagliato del file — che su Express è un errore facilissimo da commettere, perché lì l'ordine dei middleware è tutto.

Per condividere qualcosa verso l'alto serve dichiararlo esplicitamente. Il confine è il valore: rende evidente cosa è disponibile dove.

La velocità, con onestà

Fastify è più veloce di Express nei confronti sintetici, e la differenza è reale. Ma va messa in prospettiva.

In un'applicazione normale il tempo se ne va altrove: query al database, chiamate a servizi esterni, latenza di rete. Il tempo speso dal framework a instradare la richiesta è una frazione minima del totale.

Passare a Fastify per la velocità, su un'applicazione che interroga un database a ogni richiesta, non produce un miglioramento percepibile. Se il tuo problema sono i tempi di risposta, cerca le query lente e la cache mancante prima del framework.

Dove invece si sente davvero: servizi che rispondono con molti dati JSON, applicazioni con volumi di richieste molto alti, gateway che smistano traffico. Lì la serializzazione rapida cambia i numeri.

Sceglilo per gli schemi e i plugin. La velocità è un effetto collaterale gradito.

Errori comuni

Riutilizzare middleware di Express senza adattarli. L'ecosistema Fastify ha i suoi plugin ufficiali; quelli Express funzionano solo tramite un livello di compatibilità, perdendo parte dei benefici.

Dimenticare await su listen o sulla registrazione dei plugin. Fastify è asincrono in profondità: senza attendere, si finisce a interrogare un server non ancora pronto.

Non dichiarare lo schema di risposta. Ti perdi la serializzazione rapida e il filtro sui campi — cioè due dei tre vantaggi principali. È lo spreco più comune.

Aspettarsi che l'incapsulamento funzioni come l'ereditarietà. Il flusso va dal genitore al figlio, non il contrario: un plugin figlio non condivide automaticamente ciò che registra con chi sta sopra.

Sceglierlo solo per i numeri dei confronti. Vedi sopra.

Fastify, Express o NestJS

ExpressFastifyNestJS
VelocitàBuonaMiglioreBuona
ValidazioneDa aggiungereIntegrataIntegrata
StrutturaLiberaLiberaImposta
EcosistemaEnormeBuonoBuono
TypeScriptAggiuntoOttimoNativo
CurvaMinimaBassaRipida

Express se vuoi la massima quantità di esempi e risposte trovabili: resta il più diffuso, e su un progetto piccolo è imbattibile per rapidità di partenza.

Fastify se parti da zero e vuoi validazione e struttura senza imporre un'architettura. È il compromesso più equilibrato oggi per un'API nuova.

NestJS se la disciplina architetturale conta più della libertà — team numerosi, progetti lunghi. Nota che Nest può usare Fastify come motore sottostante: non sono in competizione diretta.

Quando NON ti serve

Se hai un Express che funziona, non migrare per moda. Riscrivere un backend che fa il suo lavoro per guadagnare millisecondi invisibili all'utente è tempo tolto a cose che contano.

Se il backend sta nel framework frontend. Con Next.js hai già le rotte API.

Se ti servono funzioni brevi e sporadiche, il modello giusto è un altro: le serverless functions.

Se il progetto è minuscolo. Per tre endpoint la differenza tra i framework è rumore.

In sintesi

Fastify è un framework Node moderno le cui due idee portanti sono gli schemi JSON e i plugin incapsulati.

Gli schemi ti danno tre cose insieme: validazione automatica delle richieste, serializzazione molto più rapida, e un filtro che impedisce ai campi non dichiarati di finire nelle risposte.

L'incapsulamento dei plugin elimina la fragilità dell'ordine dei middleware, che su Express è la causa di metà dei bug di chi inizia.

La velocità è reale ma raramente decisiva: nella maggior parte delle applicazioni il collo di bottiglia è il database, non il framework. Sceglilo per come ti fa scrivere il codice.

Per il confronto con l'alternativa più diffusa, vedi cos'è Express; per quella più strutturata, cos'è NestJS.