Hoppa till huvudinnehållet
Version: 11.x

Hjälpfunktioner för serversidan

Inofficiell Beta-översättning

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.

ts
import { createServerSideHelpers } from '@trpc/react-query/server';
import { createContext } from './server/context';
import { appRouter } from './server/routers/_app';
import superjson from 'superjson';
 
const helpers = createServerSideHelpers({
router: appRouter,
ctx: await createContext(),
transformer: superjson,
});
ts
import { createServerSideHelpers } from '@trpc/react-query/server';
import { createContext } from './server/context';
import { appRouter } from './server/routers/_app';
import superjson from 'superjson';
 
const helpers = createServerSideHelpers({
router: appRouter,
ctx: await createContext(),
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.

ts
import { createTRPCClient, httpBatchLink } from '@trpc/client';
import { createServerSideHelpers } from '@trpc/react-query/server';
import type { AppRouter } from './server/router';
import superjson from 'superjson';
 
const proxyClient = createTRPCClient<AppRouter>({
links: [
httpBatchLink({
url: 'http://localhost:3000/api/trpc',
}),
],
});
 
const helpers = createServerSideHelpers({
client: proxyClient,
});
ts
import { createTRPCClient, httpBatchLink } from '@trpc/client';
import { createServerSideHelpers } from '@trpc/react-query/server';
import type { AppRouter } from './server/router';
import superjson from 'superjson';
 
const proxyClient = createTRPCClient<AppRouter>({
links: [
httpBatchLink({
url: 'http://localhost:3000/api/trpc',
}),
],
});
 
const helpers = 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:
const props = {
// very important - use `trpcState` as the key
trpcState: helpers.dehydrate(),
};
ts
// In getServerSideProps / getStaticProps:
const props = {
// very important - use `trpcState` as the key
trpcState: 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.

information

För ett komplett exempel, se vårt E2E SSG-testexempel

Next.js-exempel

pages/posts/[id].tsx
tsx
import { createServerSideHelpers } from '@trpc/react-query/server';
import { appRouter } from './server/routers/_app';
import { trpc } from './utils/trpc';
import { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next';
import superjson from 'superjson';
 
export async function getServerSideProps(
context: GetServerSidePropsContext<{ id: string }>,
) {
const helpers = createServerSideHelpers({
router: appRouter,
ctx: {},
transformer: superjson,
});
const id = 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.
*/
await helpers.post.byId.prefetch({ id });
 
// Make sure to return { props: { trpcState: helpers.dehydrate() } }
return {
props: {
trpcState: helpers.dehydrate(),
id,
},
};
}
 
export default function PostViewPage(
props: InferGetServerSidePropsType<typeof getServerSideProps>,
) {
const { id } = props;
const postQuery = trpc.post.byId.useQuery({ id });
if (postQuery.status !== 'success') {
// won't happen since the query has been prefetched
return <>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].tsx
tsx
import { createServerSideHelpers } from '@trpc/react-query/server';
import { appRouter } from './server/routers/_app';
import { trpc } from './utils/trpc';
import { GetServerSidePropsContext, InferGetServerSidePropsType } from 'next';
import superjson from 'superjson';
 
export async function getServerSideProps(
context: GetServerSidePropsContext<{ id: string }>,
) {
const helpers = createServerSideHelpers({
router: appRouter,
ctx: {},
transformer: superjson,
});
const id = 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.
*/
await helpers.post.byId.prefetch({ id });
 
// Make sure to return { props: { trpcState: helpers.dehydrate() } }
return {
props: {
trpcState: helpers.dehydrate(),
id,
},
};
}
 
export default function PostViewPage(
props: InferGetServerSidePropsType<typeof getServerSideProps>,
) {
const { id } = props;
const postQuery = trpc.post.byId.useQuery({ id });
if (postQuery.status !== 'success') {
// won't happen since the query has been prefetched
return <>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>
</>
);
}