Visión general de los Links
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
Los links te permiten personalizar el flujo de datos entre el Cliente y Servidor de tRPC. Cada link debe realizar una única tarea, que puede ser una modificación autocontenida de una operación tRPC (query, mutation o subscription) o un efecto secundario basado en la operación (como logging).
Puedes componer varios links en un array que proporcionas a la configuración del cliente tRPC mediante la propiedad links, representando así una cadena de links. Esto significa que el cliente tRPC ejecutará los links en el orden en que se añaden al array links al hacer una solicitud, y los ejecutará en orden inverso al manejar la respuesta. Esta representación visual ilustra la cadena de links:
Los siguientes ejemplos asumen que usas Next.js, pero se aplican igualmente si usas el cliente vanilla de tRPC
utils/trpc.tstsximport { httpBatchLink, loggerLink } from '@trpc/client';import { createTRPCNext } from '@trpc/next';export default createTRPCNext<AppRouter>({config() {const url = `http://localhost:3000`;return {links: [loggerLink(),httpBatchLink({url,}),],};},});
utils/trpc.tstsximport { httpBatchLink, loggerLink } from '@trpc/client';import { createTRPCNext } from '@trpc/next';export default createTRPCNext<AppRouter>({config() {const url = `http://localhost:3000`;return {links: [loggerLink(),httpBatchLink({url,}),],};},});
Creando un link personalizado
Un link es una función que sigue el tipo TRPCLink. Cada link se compone de tres partes:
-
El link retorna una función que recibe un parámetro de tipo
TRPCClientRuntime. Este argumento es proporcionado por tRPC y se usa al crear un link terminador. Si no estás creando un link terminador, puedes crear directamente una función sin parámetros. En este caso, el link debe añadirse al arraylinkssin invocarse (links: [..., myLink, httpBatchLink(...)]). -
La función del paso 1 retorna otra función que recibe un objeto con dos propiedades:
op(laOperationque está ejecutando el cliente) ynext(la función para llamar al siguiente link en la cadena). -
La función del paso 2 retorna una función final que devuelve la función
observablede@trpc/server. Elobservablerecibe una función que obtiene unobserver, el cual ayuda a nuestro link a notificar al siguiente link ascendente cómo debe manejar el resultado de la operación. En esta función, podemos simplemente retornarnext(op)o suscribirnos anext, lo que permite a nuestro link manejar el resultado de la operación.
Ejemplo
utils/customLink.tstsximport { TRPCLink } from '@trpc/client';import { observable } from '@trpc/server/observable';import type { AppRouter } from '~/server/routers/_app';export const customLink: TRPCLink<AppRouter> = () => {// here we just got initialized in the app - this happens once per app// useful for storing cache for instancereturn ({ next, op }) => {// this is when passing the result to the next link// each link needs to return an observable which propagates resultsreturn observable((observer) => {console.log('performing operation:', op);const unsubscribe = next(op).subscribe({next(value) {console.log('we received value', value);observer.next(value);},error(err) {console.log('we received error', err);observer.error(err);},complete() {observer.complete();},});return unsubscribe;});};};
utils/customLink.tstsximport { TRPCLink } from '@trpc/client';import { observable } from '@trpc/server/observable';import type { AppRouter } from '~/server/routers/_app';export const customLink: TRPCLink<AppRouter> = () => {// here we just got initialized in the app - this happens once per app// useful for storing cache for instancereturn ({ next, op }) => {// this is when passing the result to the next link// each link needs to return an observable which propagates resultsreturn observable((observer) => {console.log('performing operation:', op);const unsubscribe = next(op).subscribe({next(value) {console.log('we received value', value);observer.next(value);},error(err) {console.log('we received error', err);observer.error(err);},complete() {observer.complete();},});return unsubscribe;});};};
Referencias
Si necesitas referencias más prácticas para crear tu link personalizado, puedes revisar algunos links incorporados que tRPC proporciona en GitHub.
El link terminador
El link terminador es el último eslabón en la cadena de links. En lugar de llamar a la función next, el link terminador se encarga de enviar tu operación tRPC compuesta al servidor tRPC y retornar un OperationResultEnvelope.
El array links que añades a la configuración del cliente tRPC debe contener al menos un link, y ese link debe ser terminador. Si links no tiene un link terminador al final, la operación tRPC no se enviará al servidor.
httpBatchLink es el link terminador recomendado por tRPC.
httpLink, wsLink y localLink son otros ejemplos de links terminadores.
Gestión del contexto
Cuando una operación avanza por tu cadena de links, mantiene un contexto que cada link puede leer y modificar. Esto permite que los links pasen metadatos a lo largo de la cadena que otros links usan en su lógica de ejecución.
Obtén y modifica el objeto de contexto actual accediendo a op.context.
Puedes establecer el valor inicial del objeto de contexto para una operación específica proporcionando el parámetro context al hook query o useQuery (o mutation, subscription, etc.).
Para un caso de uso de ejemplo, consulta Desactivar el procesamiento por lotes para ciertas solicitudes.