独立适配器
tRPC 的独立适配器是启动新项目的最简单方法。它非常适合本地开发和基于服务器的生产环境。本质上,它只是围绕标准 Node.js HTTP 服务器 的一个包装器,具有与 tRPC 相关的正常选项。
如果您有现有的 API 部署,例如 Express、Fastify 或 Next.js,您想将 tRPC 集成到其中,您应该查看它们各自的适配器。同样,如果您希望在无服务器或边缘计算上托管,我们有像 AWS Lambda 和 Fetch 这样的适配器,它们可能适合您的需求。
在部署的适配器难以在本地机器上运行的情况下,在您的应用程序中拥有 2 个入口点也很常见。您可以使用独立适配器进行本地开发,并在部署时使用不同的适配器。
示例应用程序
描述 | 链接 |
---|---|
独立 tRPC 服务器 | |
带有 CORS 处理的独立 tRPC 服务器 |
设置独立 tRPC 服务器
1. 实现您的应用程序路由器
实现您的 tRPC 路由器。例如
appRouter.tsts
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 choicereturn await UserModel.create({data: opts.input,});}),});// export type definition of APIexport type AppRouter = typeof appRouter;
appRouter.tsts
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 choicereturn await UserModel.create({data: opts.input,});}),});// export type definition of APIexport type AppRouter = typeof appRouter;
有关更多信息,您可以查看 快速入门指南
2. 使用独立适配器
独立适配器运行一个简单的 Node.js HTTP 服务器。
server.tsts
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.tsts
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 corsyarn add -D @types/cors
bash
yarn add corsyarn add -D @types/cors
有关如何配置此包的完整信息,请 查看文档
2. 配置独立服务器
此示例只是将 CORS 打开到任何请求,这对于开发很有用,但您可以在生产环境中更严格地配置它。
server.tsts
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.tsts
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
以外的事情。但是,它旨在成为一个简单的逃生舱口,因此它本身不会允许您将多个中间件组合在一起。如果您想这样做,您可以
- 使用具有更全面的中间件支持的备用适配器,例如 Express 适配器
- 使用组合中间件的解决方案,例如 connect
- 使用自定义 http 服务器扩展独立
createHTTPHandler
(见下文)
更进一步
createHTTPServer
返回 Node 的内置 http.Server
的实例 (https://node.org.cn/api/http.html#class-httpserver),这意味着您可以访问它的所有属性和 API。但是,如果 createHTTPServer
不足以满足您的用例,您也可以使用独立适配器的 createHTTPHandler
函数来创建您自己的 HTTP 服务器。例如
server.tsts
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.tsts
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);