跳至主要内容
版本:11.x

独立适配器

tRPC 的独立适配器是启动新项目的最简单方法。它非常适合本地开发和基于服务器的生产环境。本质上,它只是围绕标准 Node.js HTTP 服务器 的一个包装器,具有与 tRPC 相关的正常选项。

如果您有现有的 API 部署,例如 ExpressFastifyNext.js,您想将 tRPC 集成到其中,您应该查看它们各自的适配器。同样,如果您希望在无服务器或边缘计算上托管,我们有像 AWS LambdaFetch 这样的适配器,它们可能适合您的需求。

在部署的适配器难以在本地机器上运行的情况下,在您的应用程序中拥有 2 个入口点也很常见。您可以使用独立适配器进行本地开发,并在部署时使用不同的适配器。

示例应用程序

描述链接
独立 tRPC 服务器
带有 CORS 处理的独立 tRPC 服务器

设置独立 tRPC 服务器

1. 实现您的应用程序路由器

实现您的 tRPC 路由器。例如

appRouter.ts
ts
import { initTRPC } from '@trpc/server';
import { z } from 'zod';
export const t = initTRPC.create();
export const appRouter = t.router({
getUser: t.procedure.input(z.string()).query((opts) => {
return { id: opts.input, name: 'Bilbo' };
}),
createUser: t.procedure
.input(z.object({ name: z.string().min(5) }))
.mutation(async (opts) => {
// use your ORM of choice
return await UserModel.create({
data: opts.input,
});
}),
});
// export type definition of API
export type AppRouter = typeof appRouter;
appRouter.ts
ts
import { initTRPC } from '@trpc/server';
import { z } from 'zod';
export const t = initTRPC.create();
export const appRouter = t.router({
getUser: t.procedure.input(z.string()).query((opts) => {
return { id: opts.input, name: 'Bilbo' };
}),
createUser: t.procedure
.input(z.object({ name: z.string().min(5) }))
.mutation(async (opts) => {
// use your ORM of choice
return await UserModel.create({
data: opts.input,
});
}),
});
// export type definition of API
export type AppRouter = typeof appRouter;

有关更多信息,您可以查看 快速入门指南

2. 使用独立适配器

独立适配器运行一个简单的 Node.js HTTP 服务器。

server.ts
ts
import { initTRPC } from '@trpc/server';
import { createHTTPServer } from '@trpc/server/adapters/standalone';
import { appRouter } from './appRouter.ts';
createHTTPServer({
router: appRouter,
createContext() {
console.log('context 3');
return {};
},
}).listen(2022);
server.ts
ts
import { initTRPC } from '@trpc/server';
import { createHTTPServer } from '@trpc/server/adapters/standalone';
import { appRouter } from './appRouter.ts';
createHTTPServer({
router: appRouter,
createContext() {
console.log('context 3');
return {};
},
}).listen(2022);

处理 CORS 和 OPTIONS

默认情况下,独立服务器不会响应 HTTP OPTIONS 请求,也不会设置任何 CORS 标头。

如果您没有在可以为您处理此问题的环境中托管,例如在本地开发期间,您可能需要处理它。

1. 安装 cors

您可以使用流行的 cors 包自己添加支持

bash
yarn add cors
yarn add -D @types/cors
bash
yarn add cors
yarn add -D @types/cors

有关如何配置此包的完整信息,请 查看文档

2. 配置独立服务器

此示例只是将 CORS 打开到任何请求,这对于开发很有用,但您可以在生产环境中更严格地配置它。

server.ts
ts
import { initTRPC } from '@trpc/server';
import { createHTTPServer } from '@trpc/server/adapters/standalone';
import cors from 'cors';
createHTTPServer({
middleware: cors(),
router: appRouter,
createContext() {
console.log('context 3');
return {};
},
}).listen(3333);
server.ts
ts
import { initTRPC } from '@trpc/server';
import { createHTTPServer } from '@trpc/server/adapters/standalone';
import cors from 'cors';
createHTTPServer({
middleware: cors(),
router: appRouter,
createContext() {
console.log('context 3');
return {};
},
}).listen(3333);

middleware 选项将接受任何类似于连接/node.js 中间件的函数,因此如果需要,它可以用于处理 cors 以外的事情。但是,它旨在成为一个简单的逃生舱口,因此它本身不会允许您将多个中间件组合在一起。如果您想这样做,您可以

  1. 使用具有更全面的中间件支持的备用适配器,例如 Express 适配器
  2. 使用组合中间件的解决方案,例如 connect
  3. 使用自定义 http 服务器扩展独立 createHTTPHandler(见下文)

更进一步

createHTTPServer 返回 Node 的内置 http.Server 的实例 (https://node.org.cn/api/http.html#class-httpserver),这意味着您可以访问它的所有属性和 API。但是,如果 createHTTPServer 不足以满足您的用例,您也可以使用独立适配器的 createHTTPHandler 函数来创建您自己的 HTTP 服务器。例如

server.ts
ts
import { createServer } from 'http';
import { initTRPC } from '@trpc/server';
import { createHTTPHandler } from '@trpc/server/adapters/standalone';
const handler = createHTTPHandler({
router: appRouter,
createContext() {
return {};
},
});
createServer((req, res) => {
/**
* Handle the request however you like,
* just call the tRPC handler when you're ready
*/
handler(req, res);
}).listen(3333);
server.ts
ts
import { createServer } from 'http';
import { initTRPC } from '@trpc/server';
import { createHTTPHandler } from '@trpc/server/adapters/standalone';
const handler = createHTTPHandler({
router: appRouter,
createContext() {
return {};
},
});
createServer((req, res) => {
/**
* Handle the request however you like,
* just call the tRPC handler when you're ready
*/
handler(req, res);
}).listen(3333);