独立适配器
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
tRPC 的独立适配器是新项目启动的最简方案,特别适合本地开发和基于服务器的生产环境。本质上它只是对标准 Node.js HTTP Server 的封装,并集成了 tRPC 相关配置选项。
若需将 tRPC 集成到现有 API 部署环境(如 Express、Fastify 或 Next.js),请查阅对应的适配器文档。同样地,如果倾向在无服务器或边缘计算环境部署,我们提供 AWS Lambda 和 Fetch 等适配器方案。
当部署环境的适配器难以在本地运行时,常见做法是在应用中设置双入口:开发环境使用独立适配器,生产环境切换为其他适配器。
示例应用
| Description | Links |
|---|---|
| Standalone tRPC Server | |
| Standalone tRPC Server with CORS handling |
配置独立 tRPC 服务器
1. 实现应用路由
实现 tRPC 路由,例如:
appRouter.tstsimport { 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 choicereturn await UserModel.create({data: opts.input,});}),});// export type definition of APIexport type AppRouter = typeof appRouter;
appRouter.tstsimport { 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 choicereturn await UserModel.create({data: opts.input,});}),});// export type definition of APIexport type AppRouter = typeof appRouter;
更多实现细节请参考快速入门指南
2. 使用独立适配器
该适配器会启动一个简易的 Node.js HTTP 服务器。
server.tstsimport { 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.tstsimport { 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 包自行添加支持:
bashyarn add corsyarn add -D @types/cors
bashyarn add corsyarn add -D @types/cors
完整配置方法请查阅文档
2. 配置独立服务器
此示例为开发便利开放了全量 CORS,生产环境应严格限制访问源:
server.tstsimport { 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.tstsimport { 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 选项接受任何类 connect/node.js 中间件函数,因此不仅限于处理 cors。但需注意:这仅是简易扩展方案,无法直接组合多个中间件。如需高级功能可尝试:
-
改用支持完整中间件体系的适配器(如 Express 适配器)
-
使用中间件组合方案(例如 connect)
-
基于独立适配器的
createHTTPHandler扩展自定义 HTTP 服务器(见下文)
高级扩展
若 createHTTPServer 无法满足需求,可通过独立适配器的 createHTTPHandler 创建自定义 HTTP 服务器:
server.tstsimport { 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.tstsimport { 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);