Hoppa till huvudinnehållet
Version: 9.x

Använda med Fastify

Inofficiell Beta-översättning

Denna sida har översatts av PageTurner AI (beta). Inte officiellt godkänd av projektet. Hittade du ett fel? Rapportera problem →

Exempelapp

Det bästa sättet att komma igång med Fastify-adaptern är att titta på exempelapplikationen.

DescriptionLinks
  • Fastify server with WebSocket
  • Simple tRPC client in node

Så här använder du tRPC med Fastify

Installera beroenden

bash
yarn add @trpc/server fastify zod
bash
yarn add @trpc/server fastify zod

Zod är inte ett obligatoriskt beroende, men det används i exempelroutern nedan.

Skapa routern

Först och främst behöver du en routern för att hantera dina queries, mutations och prenumerationer.

En exempelrouter visas nedan, spara den i en fil som heter router.ts.

router.ts
router.ts
ts
import * as trpc from '@trpc/server';
import { z } from 'zod';
type User = {
id: string;
name: string;
bio?: string;
};
const users: Record<string, User> = {};
export const appRouter = trpc
.router()
.query('getUserById', {
input: z.string(),
async resolve({ input }) {
return users[input]; // input type is string
},
})
.mutation('createUser', {
// validate input with Zod
input: z.object({
name: z.string().min(3),
bio: z.string().max(142).optional(),
}),
async resolve({ input }) {
const id = Date.now().toString();
const user: User = { id, ...input };
users[user.id] = user;
return user;
},
});
// export type definition of API
export type AppRouter = typeof appRouter;
router.ts
ts
import * as trpc from '@trpc/server';
import { z } from 'zod';
type User = {
id: string;
name: string;
bio?: string;
};
const users: Record<string, User> = {};
export const appRouter = trpc
.router()
.query('getUserById', {
input: z.string(),
async resolve({ input }) {
return users[input]; // input type is string
},
})
.mutation('createUser', {
// validate input with Zod
input: z.object({
name: z.string().min(3),
bio: z.string().max(142).optional(),
}),
async resolve({ input }) {
const id = Date.now().toString();
const user: User = { id, ...input };
users[user.id] = user;
return user;
},
});
// export type definition of API
export type AppRouter = typeof appRouter;

Om din routerfil börjar bli för stor, dela upp den i flera underrouter som implementeras i egna filer. Sedan sammanfogar du dem till en enda root appRouter.

Skapa contexten

Därefter behöver du en context som skapas för varje förfrågan.

Ett exempel på en context visas nedan, spara den i en fil som heter context.ts:

context.ts
context.ts
ts
import { inferAsyncReturnType } from '@trpc/server';
import { CreateFastifyContextOptions } from '@trpc/server/adapters/fastify';
export function createContext({ req, res }: CreateFastifyContextOptions) {
const user = { name: req.headers.username ?? 'anonymous' };
return { req, res, user };
}
export type Context = inferAsyncReturnType<typeof createContext>;
context.ts
ts
import { inferAsyncReturnType } from '@trpc/server';
import { CreateFastifyContextOptions } from '@trpc/server/adapters/fastify';
export function createContext({ req, res }: CreateFastifyContextOptions) {
const user = { name: req.headers.username ?? 'anonymous' };
return { req, res, user };
}
export type Context = inferAsyncReturnType<typeof createContext>;

Skapa Fastify-server

tRPC innehåller en adapter för Fastify direkt ur lådan. Denna adapter låter dig konvertera din tRPC-router till ett Fastify-plugin. För att förhindra fel vid stora batchförfrågningar, se till att ställa in Fastify-alternativet maxParamLength till ett lämpligt värde enligt exemplet.

server.ts
ts
import { fastifyTRPCPlugin } from '@trpc/server/adapters/fastify';
import fastify from 'fastify';
import { createContext } from './context';
import { appRouter } from './router';
const server = fastify({
maxParamLength: 5000,
});
server.register(fastifyTRPCPlugin, {
prefix: '/trpc',
trpcOptions: { router: appRouter, createContext },
});
(async () => {
try {
await server.listen({ port: 3000 });
} catch (err) {
server.log.error(err);
process.exit(1);
}
})();
server.ts
ts
import { fastifyTRPCPlugin } from '@trpc/server/adapters/fastify';
import fastify from 'fastify';
import { createContext } from './context';
import { appRouter } from './router';
const server = fastify({
maxParamLength: 5000,
});
server.register(fastifyTRPCPlugin, {
prefix: '/trpc',
trpcOptions: { router: appRouter, createContext },
});
(async () => {
try {
await server.listen({ port: 3000 });
} catch (err) {
server.log.error(err);
process.exit(1);
}
})();

Dina endpoints är nu tillgängliga via HTTP!

EndpointHTTP URI
getUserGET http://localhost:3000/trpc/getUserById?input=INPUT

where INPUT is a URI-encoded JSON string.
createUserPOST http://localhost:3000/trpc/createUser

with req.body of type User

Så här aktiverar du prenumerationer (WebSocket)

Fastify-adaptern stöder prenumerationer via @fastify/websocket-plugin:et. Utöver stegen ovan behöver du bara installera beroendet, lägga till prenumerationer i din router och aktivera useWSS-alternativet i plugin:et. Minsta version av Fastify som krävs för @fastify/websocket är 3.11.0.

Installera beroenden

bash
yarn add @fastify/websocket
bash
yarn add @fastify/websocket

Importera och registrera @fastify/websocket

ts
import ws from '@fastify/websocket';
server.register(ws);
ts
import ws from '@fastify/websocket';
server.register(ws);

Lägg till prenumerationer

Redigera filen router.ts som skapades i de tidigare stegen och lägg till följande kod:

router.ts
ts
export const appRouter = trpc
.router()
// .query(...)
// .mutation(...)
.subscription('randomNumber', {
resolve() {
return new Subscription<{ randomNumber: number }>((emit) => {
const timer = setInterval(() => {
emit.data({ randomNumber: Math.random() });
}, 1000);
return () => {
clearInterval(timer);
};
});
},
});
router.ts
ts
export const appRouter = trpc
.router()
// .query(...)
// .mutation(...)
.subscription('randomNumber', {
resolve() {
return new Subscription<{ randomNumber: number }>((emit) => {
const timer = setInterval(() => {
emit.data({ randomNumber: Math.random() });
}, 1000);
return () => {
clearInterval(timer);
};
});
},
});

Aktivera alternativet useWSS

server.ts
ts
server.register(fastifyTRPCPlugin, {
useWSS: true,
// ...
});
server.ts
ts
server.register(fastifyTRPCPlugin, {
useWSS: true,
// ...
});

Det är helt okej, du kan prenumerera på ämnet randomNumber och du bör få ett slumpmässigt nummer varje sekund 🚀.

Fastify-plugin-alternativ

nametypeoptionaldefaultdescription
prefixstringtrue"/trpc"
useWSSbooleantruefalse
trpcOptionsNodeHTTPHandlerOptionsfalsen/a