Saltar al contenido principal
Versión: 9.x

Transformadores de Datos

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Puedes serializar los datos de respuesta y los argumentos de entrada. Los transformadores deben agregarse tanto en el servidor como en el cliente.

Uso de superjson​

SuperJSON nos permite usar transparentemente tipos estándar como Date, Map o Set en la comunicación entre servidor y cliente. Esto significa que puedes devolver cualquiera de estos tipos en tu API-resolver y utilizarlos directamente en el cliente sin reconstruir los objetos desde JSON.

Cómo hacerlo​

1. Instalar​

bash
yarn add superjson
bash
yarn add superjson

2. Agregar a la configuración de createTRPCCLient() o withTRPC()​

client.ts
ts
import superjson from 'superjson';
// [...]
export const client = createTRPCClient<AppRouter>({
// [...]
transformer: superjson,
});
client.ts
ts
import superjson from 'superjson';
// [...]
export const client = createTRPCClient<AppRouter>({
// [...]
transformer: superjson,
});
pages/_app.tsx
ts
import superjson from 'superjson';
// [...]
export default withTRPC<AppRouter>({
config(config) {
return {
// [...]
transformer: superjson,
};
},
})(MyApp);
pages/_app.tsx
ts
import superjson from 'superjson';
// [...]
export default withTRPC<AppRouter>({
config(config) {
return {
// [...]
transformer: superjson,
};
},
})(MyApp);

3. Agregar a tu AppRouter​

server/routers/_app.ts
ts
import * as trpc from '@trpc/server';
import superjson from 'superjson';
export const appRouter = trpc.router().transformer(superjson);
// .query(...)
server/routers/_app.ts
ts
import * as trpc from '@trpc/server';
import superjson from 'superjson';
export const appRouter = trpc.router().transformer(superjson);
// .query(...)

Transformadores diferentes para subida y descarga​

Si un transformador debe usarse solo en una dirección o necesitas diferentes transformadores para subida y descarga (por ejemplo, por razones de rendimiento), puedes proporcionar transformadores individuales para cada operación. Asegúrate de usar el mismo transformador combinado en todos los puntos.

Cómo hacerlo​

En este ejemplo se usa superjson para subir datos y devalue para descargar, porque devalue es mucho más rápido pero inseguro para usar en el servidor.

1. Instalar​

bash
yarn add superjson devalue
bash
yarn add superjson devalue

2. Agregar a utils/trpc.ts​

utils/trpc.ts
ts
import { uneval } from 'devalue';
import superjson from 'superjson';
// [...]
export const transformer = {
input: superjson,
output: {
serialize: (object) => uneval(object),
deserialize: (object) => eval(`(${object})`),
},
};
utils/trpc.ts
ts
import { uneval } from 'devalue';
import superjson from 'superjson';
// [...]
export const transformer = {
input: superjson,
output: {
serialize: (object) => uneval(object),
deserialize: (object) => eval(`(${object})`),
},
};

3. Agregar a createTRPCCLient()​

client.ts
ts
import { transformer } from '../utils/trpc';
// [...]
export const client = createTRPCClient<AppRouter>({
// [...]
transformer: transformer,
});
client.ts
ts
import { transformer } from '../utils/trpc';
// [...]
export const client = createTRPCClient<AppRouter>({
// [...]
transformer: transformer,
});

4. Agregar a tu AppRouter​

server/routers/_app.ts
ts
import * as trpc from '@trpc/server';
import { transformer } from '../../utils/trpc';
export const appRouter = trpc.router().transformer(transformer);
// .query(...)
server/routers/_app.ts
ts
import * as trpc from '@trpc/server';
import { transformer } from '../../utils/trpc';
export const appRouter = trpc.router().transformer(transformer);
// .query(...)

Interfaz DataTransformer​

ts
type DataTransformer = {
serialize(object: any): any;
deserialize(object: any): any;
};
type CombinedDataTransformer = {
input: DataTransformer;
output: DataTransformer;
};
ts
type DataTransformer = {
serialize(object: any): any;
deserialize(object: any): any;
};
type CombinedDataTransformer = {
input: DataTransformer;
output: DataTransformer;
};