Använda med Fastify
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.
| Description | Links |
|---|---|
|
Så här använder du tRPC med Fastify
Installera beroenden
bashyarn add @trpc/server fastify zod
bashyarn 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.tstsimport * 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 Zodinput: 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 APIexport type AppRouter = typeof appRouter;
router.tstsimport * 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 Zodinput: 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 APIexport 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.tstsimport { 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.tstsimport { 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.tstsimport { 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.tstsimport { 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!
| Endpoint | HTTP URI |
|---|---|
getUser | GET http://localhost:3000/trpc/getUserById?input=INPUT where INPUT is a URI-encoded JSON string. |
createUser | POST 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
bashyarn add @fastify/websocket
bashyarn add @fastify/websocket
Importera och registrera @fastify/websocket
tsimport ws from '@fastify/websocket';server.register(ws);
tsimport 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.tstsexport 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.tstsexport 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.tstsserver.register(fastifyTRPCPlugin, {useWSS: true,// ...});
server.tstsserver.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
| name | type | optional | default | description |
|---|---|---|---|---|
| prefix | string | true | "/trpc" | |
| useWSS | boolean | true | false | |
| trpcOptions | NodeHTTPHandlerOptions | false | n/a |