Hjälpfunktioner för serversidan
Denna sida har översatts av PageTurner AI (beta). Inte officiellt godkänd av projektet. Hittade du ett fel? Rapportera problem →
Server-Side Helpers ger dig en uppsättning hjälpfunktioner för att förhämta queries på servern. Detta är användbart för SSG, men även för SSR om du väljer att inte använda ssr: true.
Genom att förhämta via Server-Side Helpers fyller du query-cachen på servern, vilket innebär att dessa queries inte behöver hämtas på klienten initialt.
Det finns 2 sätt att använda Server-Side Helpers
1. Intern router
Denna metod används när du har direkt åtkomst till din tRPC-router, t.ex. när du utvecklar en monolitisk Next.js-applikation.
Genom att använda hjälpfunktionerna låter du tRPC anropa dina procedurer direkt på servern utan HTTP-förfrågan, liknande server-side calls.
Det innebär också att du inte har tillgång till request och response som vanligt. Se till att du instansierar server-side helpers med en kontext utan req & res, som vanligtvis fylls via kontextskapandet. Vi rekommenderar konceptet med "inner" och "outer" context i det scenariot.
tsimport {createServerSideHelpers } from '@trpc/react-query/server';import {createContext } from './server/context';import {appRouter } from './server/routers/_app';importsuperjson from 'superjson';consthelpers =createServerSideHelpers ({router :appRouter ,ctx : awaitcreateContext (),transformer :superjson ,});
tsimport {createServerSideHelpers } from '@trpc/react-query/server';import {createContext } from './server/context';import {appRouter } from './server/routers/_app';importsuperjson from 'superjson';consthelpers =createServerSideHelpers ({router :appRouter ,ctx : awaitcreateContext (),transformer :superjson ,});
2. Extern router
Denna metod används när du inte har direkt åtkomst till din tRPC-router, t.ex. när du utvecklar en Next.js-applikation och ett fristående API som är värd separat.
tsimport {createTRPCClient ,httpBatchLink } from '@trpc/client';import {createServerSideHelpers } from '@trpc/react-query/server';import type {AppRouter } from './server/router';importsuperjson from 'superjson';constproxyClient =createTRPCClient <AppRouter >({links : [httpBatchLink ({url : 'http://localhost:3000/api/trpc',}),],});consthelpers =createServerSideHelpers ({client :proxyClient ,});
tsimport {createTRPCClient ,httpBatchLink } from '@trpc/client';import {createServerSideHelpers } from '@trpc/react-query/server';import type {AppRouter } from './server/router';importsuperjson from 'superjson';constproxyClient =createTRPCClient <AppRouter >({links : [httpBatchLink ({url : 'http://localhost:3000/api/trpc',}),],});consthelpers =createServerSideHelpers ({client :proxyClient ,});
Användning av hjälpfunktioner
Server-Side Helpers-metoderna returnerar ett objekt som speglar din router-struktur med alla dina routers som nycklar. Men istället för useQuery och useMutation får du funktionerna prefetch, fetch, prefetchInfinite och fetchInfinite.
Den primära skillnaden mellan prefetch och fetch är att fetch fungerar som ett vanligt funktionsanrop och returnerar query-resultatet, medan prefetch inte returnerar något resultat och aldrig kastar fel - om du behöver det beteendet, använd fetch istället. Istället lägger prefetch till queryn i cachen, som du sedan dehydrerar och skickar till klienten.
ts// In getServerSideProps / getStaticProps:constprops = {// very important - use `trpcState` as the keytrpcState :helpers .dehydrate (),};
ts// In getServerSideProps / getStaticProps:constprops = {// very important - use `trpcState` as the keytrpcState :helpers .dehydrate (),};
Tumregel: Använd prefetch för queries du vet att du behöver på klienten, och fetch för queries där du vill använda resultatet på servern.
Funktionerna är omslag kring react-query-funktioner. Läs deras dokumentation för att lära dig mer i detalj.
För ett komplett exempel, se vårt E2E SSG-testexempel
Next.js-exempel
pages/posts/[id].tsxtsximport {createServerSideHelpers } from '@trpc/react-query/server';import {appRouter } from './server/routers/_app';import {trpc } from './utils/trpc';import {GetServerSidePropsContext ,InferGetServerSidePropsType } from 'next';importsuperjson from 'superjson';export async functiongetServerSideProps (context :GetServerSidePropsContext <{id : string }>,) {consthelpers =createServerSideHelpers ({router :appRouter ,ctx : {},transformer :superjson ,});constid =context .params ?.id as string;/** Prefetching the `post.byId` query.* `prefetch` does not return the result and never throws - if you need that behavior, use `fetch` instead.*/awaithelpers .post .byId .prefetch ({id });// Make sure to return { props: { trpcState: helpers.dehydrate() } }return {props : {trpcState :helpers .dehydrate (),id ,},};}export default functionPostViewPage (props :InferGetServerSidePropsType <typeofgetServerSideProps >,) {const {id } =props ;constpostQuery =trpc .post .byId .useQuery ({id });if (postQuery .status !== 'success') {// won't happen since the query has been prefetchedreturn <>Loading...</>;}const {data } =postQuery ;return (<><h1 >{data .title }</h1 ><em >Created {data .createdAt .toLocaleDateString ()}</em ><p >{data .text }</p ><h2 >Raw data:</h2 ><pre >{JSON .stringify (data , null, 4)}</pre ></>);}
pages/posts/[id].tsxtsximport {createServerSideHelpers } from '@trpc/react-query/server';import {appRouter } from './server/routers/_app';import {trpc } from './utils/trpc';import {GetServerSidePropsContext ,InferGetServerSidePropsType } from 'next';importsuperjson from 'superjson';export async functiongetServerSideProps (context :GetServerSidePropsContext <{id : string }>,) {consthelpers =createServerSideHelpers ({router :appRouter ,ctx : {},transformer :superjson ,});constid =context .params ?.id as string;/** Prefetching the `post.byId` query.* `prefetch` does not return the result and never throws - if you need that behavior, use `fetch` instead.*/awaithelpers .post .byId .prefetch ({id });// Make sure to return { props: { trpcState: helpers.dehydrate() } }return {props : {trpcState :helpers .dehydrate (),id ,},};}export default functionPostViewPage (props :InferGetServerSidePropsType <typeofgetServerSideProps >,) {const {id } =props ;constpostQuery =trpc .post .byId .useQuery ({id });if (postQuery .status !== 'success') {// won't happen since the query has been prefetchedreturn <>Loading...</>;}const {data } =postQuery ;return (<><h1 >{data .title }</h1 ><em >Created {data .createdAt .toLocaleDateString ()}</em ><p >{data .text }</p ><h2 >Raw data:</h2 ><pre >{JSON .stringify (data , null, 4)}</pre ></>);}