Noções Básicas do Fastify
10 exemplos para construir sua primeira API Fastify 5 - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para construir sua primeira API Fastify 5 - 7 básicos e 3 intermediários.
mkdir fastify-api && cd fastify-api
npm init -y
npm pkg set type=module
npm install fastify@5
npm install -D typescript@5.6 tsxPara validação de schema e padrões de plugin, veja Validação de JSON Schema e Plugins Fastify.
import Fastify from "fastify";
const app = Fastify({ logger: true });
app.get("/", async () => {
return { message: "Hello from Fastify 5" };
});
await app.listen({ port: 3000, host: "0.0.0.0" });logger: true habilita o Pino com padrões sensatosawait app.listen() (listen assíncrono do Fastify 5)import Fastify from "fastify";
const app = Fastify();
app.get("/users/:id", {
schema: {
params: {
type: "object",
properties: { id: { type: "string", format: "uuid" } },
required: ["id"],
},
response: {
200: {
type: "object",
properties: { id: { type: "string" }, name: { type: "string" } },
},
},
},
}, async (req) => {
return { id: req.params.id, name: "Ada Lovelace" };
});import Fastify from "fastify";
const app = Fastify();
app.post("/users", {
schema: {
body: {
type: "object",
required: ["name", "email"],
properties: {
name: { type: "string", minLength: 1 },
email: { type: "string", format: "email" },
},
},
},
}, async (req, reply) => {
const { name, email } = req.body as { name: string; email: string };
return reply.status(201).send({ id: "1", name, email });
});reply.status(201).send() para códigos de status explícitosimport Fastify from "fastify";
const app = Fastify();
app.register(async function userRoutes(fastify) {
fastify.get("/", async () => [{ id: 1, name: "Ada" }]);
fastify.get("/:id", async (req) => ({ id: (req.params as { id: string }).id }));
}, { prefix: "/users" });register cria um escopo encapsuladoprefix monta todas as rotas sob /usersimport Fastify from "fastify";
const app = Fastify({ logger: true });
app.addHook("onRequest", async (req) => {
req.headers["x-request-start"] = String(Date.now());
});
app.addHook("onResponse", async (req, reply) => {
const start = Number(req.headers["x-request-start"]);
req.log.info({ duration: Date.now() - start, status: reply.statusCode });
});
app.get("/health", async () => ({ ok: true }));onRequest é executado antes do roteamento; preHandler é executado antes do manipuladorimport Fastify from "fastify";
const app = Fastify();
app.setErrorHandler((err, _req, reply) => {
const status = err.statusCode ?? 500;
reply.status(status).send({
error: status === 500 ? "Internal server error" : err.message,
});
});
app.get("/fail", async () => {
throw Object.assign(new Error("Not found"), { statusCode: 404 });
});setErrorHandler é o manipulador de erros centralizadostatusCode a erros para erros operacionaisstatusCode: 400import Fastify from "fastify";
const app = Fastify({
logger: {
level: process.env.LOG_LEVEL ?? "info",
transport: process.env.NODE_ENV === "development"
? { target: "pino-pretty" }
: undefined,
},
});
app.get("/users", async (req) => {
req.log.info({ action: "list_users" });
return [];
});req.log é um logger filho com contexto de requisiçãoimport Fastify from "fastify";
import fp from "fastify-plugin";
const authPlugin = fp(async (fastify) => {
fastify.decorate("authenticate", async (req: { headers: { authorization?: string } }) => {
if (!req.headers.authorization) throw Object.assign(new Error("Unauthorized"), { statusCode: 401 });
});
});
const app = Fastify();
await app.register(authPlugin);
// authenticate está disponível em todos os escoposfastify-plugin, os decoradores são escopados para o plugin que os registrafp para autenticação compartilhada, conexões de banco de dados e configuraçãoimport Fastify from "fastify";
import { test } from "node:test";
import assert from "node:assert/strict";
const app = Fastify();
app.get("/health", async () => ({ ok: true }));
test("GET /health", async () => {
const res = await app.inject({ method: "GET", url: "/health" });
assert.equal(res.statusCode, 200);
assert.deepEqual(res.json(), { ok: true });
});inject() simula HTTP sem I/O de redeimport Fastify from "fastify";
const app = Fastify();
await app.listen({ port: 3000 });
const server = app.server;
server.keepAliveTimeout = 65_000;
server.headersTimeout = 66_000;
server.requestTimeout = 30_000;app.server após o listenVia @fastify/express ou middie, mas prefira plugins Fastify nativos. Middleware Express perde os benefícios da validação de schema.
Fastify para performance e APIs schema-first. Express para ecossistema máximo e familiaridade da equipe. Veja ADR Fastify vs Express.
Sim. Fastify 5 é ESM-first. Use import Fastify from "fastify".
Use fastify-type-provider-zod ou @fastify/type-provider-typebox para tipos inferidos a partir de schemas.
Sim. NestFactory.create(AppModule, new FastifyAdapter()). Veja Noções Básicas do NestJS.
Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (Active LTS), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026