数据转换器
你可以序列化响应数据和输入参数。转换器需要添加到服务器和客户端。
¥You are able to serialize the response data & input args. The transformers need to be added both to the server and the client.
使用 superjson
¥Using superjson
SuperJSON 允许我们通过服务器和客户端之间的线路透明地使用标准 Date
/Map
/Set
。也就是说,你可以从 API 解析器返回任何这些类型并在客户端中使用它们,而无需从 JSON 重新创建对象。
¥SuperJSON allows us to transparently use, e.g., standard Date
/Map
/Set
s over the wire between the server and client. That is, you can return any of these types from your API-resolver and use them in the client without having to recreate the objects from JSON.
如何
¥How to
1. 安装
¥ Install
bash
yarn add superjson
bash
yarn add superjson
2. 添加到你的 initTRPC
¥ Add to your initTRPC
routers/router/_app.tsts
import { initTRPC } from '@trpc/server';import superjson from 'superjson';export const t = initTRPC.create({transformer: superjson,});
routers/router/_app.tsts
import { initTRPC } from '@trpc/server';import superjson from 'superjson';export const t = initTRPC.create({transformer: superjson,});
3. 添加到 createTRPCProxyClient()
或 createTRPCNext()
¥ Add to createTRPCProxyClient()
or createTRPCNext()
ts
import { createTRPCProxyClient } from '@trpc/client';import type { AppRouter } from '~/server/routers/_app';import superjson from 'superjson';export const client = createTRPCProxyClient<AppRouter>({transformer: superjson, // <--// [...]});
ts
import { createTRPCProxyClient } from '@trpc/client';import type { AppRouter } from '~/server/routers/_app';import superjson from 'superjson';export const client = createTRPCProxyClient<AppRouter>({transformer: superjson, // <--// [...]});
utils/trpc.tsts
import { createTRPCNext } from '@trpc/next';import type { AppRouter } from '~/server/routers/_app';import superjson from 'superjson';// [...]export const trpc = createTRPCNext<AppRouter>({config({ ctx }) {return {transformer: superjson, // <--};},// [...]});
utils/trpc.tsts
import { createTRPCNext } from '@trpc/next';import type { AppRouter } from '~/server/routers/_app';import superjson from 'superjson';// [...]export const trpc = createTRPCNext<AppRouter>({config({ ctx }) {return {transformer: superjson, // <--};},// [...]});
用于上传和下载的不同转换器
¥Different transformers for upload and download
如果转换器仅用于一个方向或应使用不同的转换器进行上传和下载(例如,出于性能原因),你可以提供单独的转换器用于上传和下载。确保到处使用相同的组合转换器。
¥If a transformer should only be used for one direction or different transformers should be used for upload and download (e.g., for performance reasons), you can provide individual transformers for upload and download. Make sure you use the same combined transformer everywhere.
如何
¥How to
这里 superjson 用于上传,devalue 用于下载数据,因为 devalue 速度快很多,但在服务器上使用不安全。
¥Here superjson is used for uploading and devalue for downloading data because devalue is a lot faster but insecure to use on the server.
1. 安装
¥ Install
bash
yarn add superjson devalue
bash
yarn add superjson devalue
2. 添加到 utils/trpc.ts
¥ Add to utils/trpc.ts
utils/trpc.tsts
import { uneval } from 'devalue';import superjson from 'superjson';// [...]export const transformer = {input: superjson,output: {serialize: (object) => uneval(object),// This `eval` only ever happens on the **client**deserialize: (object) => eval(`(${object})`),},};
utils/trpc.tsts
import { uneval } from 'devalue';import superjson from 'superjson';// [...]export const transformer = {input: superjson,output: {serialize: (object) => uneval(object),// This `eval` only ever happens on the **client**deserialize: (object) => eval(`(${object})`),},};
3. 添加到你的 AppRouter
¥ Add to your AppRouter
server/routers/_app.tsts
import { initTRPC } from '@trpc/server';import { transformer } from '../../utils/trpc';export const t = initTRPC.create({transformer,});export const appRouter = t.router({// [...]});
server/routers/_app.tsts
import { initTRPC } from '@trpc/server';import { transformer } from '../../utils/trpc';export const t = initTRPC.create({transformer,});export const appRouter = t.router({// [...]});
4. 添加到 createTRPCProxyClient()
¥ Add to createTRPCProxyClient()
client.tsts
import { createTRPCProxyClient } from '@trpc/client';import { transformer } from '../utils/trpc';export const client = createTRPCProxyClient<AppRouter>({transformer, // <--// [...]});
client.tsts
import { createTRPCProxyClient } from '@trpc/client';import { transformer } from '../utils/trpc';export const client = createTRPCProxyClient<AppRouter>({transformer, // <--// [...]});
DataTransformer
接口
¥DataTransformer
interface
ts
export interface DataTransformer {serialize(object: any): any;deserialize(object: any): any;}interface InputDataTransformer extends DataTransformer {/*** This function runs **on the client** before sending the data to the server.*/serialize(object: any): any;/*** This function runs **on the server** to transform the data before it is passed to the resolver*/deserialize(object: any): any;}interface OutputDataTransformer extends DataTransformer {/*** This function runs **on the server** before sending the data to the client.*/serialize(object: any): any;/*** This function runs **only on the client** to transform the data sent from the server.*/deserialize(object: any): any;}export interface CombinedDataTransformer {/*** Specify how the data sent from the client to the server should be transformed.*/input: InputDataTransformer;/*** Specify how the data sent from the server to the client should be transformed.*/output: OutputDataTransformer;}
ts
export interface DataTransformer {serialize(object: any): any;deserialize(object: any): any;}interface InputDataTransformer extends DataTransformer {/*** This function runs **on the client** before sending the data to the server.*/serialize(object: any): any;/*** This function runs **on the server** to transform the data before it is passed to the resolver*/deserialize(object: any): any;}interface OutputDataTransformer extends DataTransformer {/*** This function runs **on the server** before sending the data to the client.*/serialize(object: any): any;/*** This function runs **only on the client** to transform the data sent from the server.*/deserialize(object: any): any;}export interface CombinedDataTransformer {/*** Specify how the data sent from the client to the server should be transformed.*/input: InputDataTransformer;/*** Specify how the data sent from the server to the client should be transformed.*/output: OutputDataTransformer;}