与 Express.js 集成使用
非官方测试版翻译
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
示例应用
| Description | URL | Links |
|---|---|---|
| Express server & procedure calls with node.js. | n/a |
如何将 tRPC 接入现有 Express.js 项目
1. 安装依赖
bashyarn add @trpc/server zod
bashyarn add @trpc/server zod
Zod 并非必需依赖,但下方示例路由中会使用到。
2. 创建 tRPC 路由
实现你的 tRPC 路由。下方提供示例路由:
server.tstsimport * as trpc from '@trpc/server';import { z } from 'zod';const appRouter = trpc.router().query('getUser', {input: z.string(),async resolve(req) {req.input; // stringreturn { id: req.input, name: 'Bilbo' };},}).mutation('createUser', {// validate input with Zodinput: z.object({ name: z.string().min(5) }),async resolve(req) {// use your ORM of choicereturn await UserModel.create({data: req.input,});},});// export type definition of APIexport type AppRouter = typeof appRouter;
server.tstsimport * as trpc from '@trpc/server';import { z } from 'zod';const appRouter = trpc.router().query('getUser', {input: z.string(),async resolve(req) {req.input; // stringreturn { id: req.input, name: 'Bilbo' };},}).mutation('createUser', {// validate input with Zodinput: z.object({ name: z.string().min(5) }),async resolve(req) {// use your ORM of choicereturn await UserModel.create({data: req.input,});},});// export type definition of APIexport type AppRouter = typeof appRouter;
当路由文件变得过于庞大时,可将路由拆分为多个子路由(每个子路由在独立文件中实现),然后将其合并为统一的根路由 appRouter。
3. 使用 Express.js 适配器
tRPC 内置开箱即用的 Express.js 适配器,可将 tRPC 路由转换为 Express.js 中间件。
server.tstsimport * as trpcExpress from '@trpc/server/adapters/express';const appRouter = /* ... */;const app = express();// created for each requestconst createContext = ({req,res,}: trpcExpress.CreateExpressContextOptions) => ({}) // no contexttype Context = trpc.inferAsyncReturnType<typeof createContext>;app.use('/trpc',trpcExpress.createExpressMiddleware({router: appRouter,createContext,}));app.listen(4000);
server.tstsimport * as trpcExpress from '@trpc/server/adapters/express';const appRouter = /* ... */;const app = express();// created for each requestconst createContext = ({req,res,}: trpcExpress.CreateExpressContextOptions) => ({}) // no contexttype Context = trpc.inferAsyncReturnType<typeof createContext>;app.use('/trpc',trpcExpress.createExpressMiddleware({router: appRouter,createContext,}));app.listen(4000);
现在你的端点已可通过 HTTP 访问!
| Endpoint | HTTP URI |
|---|---|
getUser | GET http://localhost:4000/trpc/getUser?input=INPUT where INPUT is a URI-encoded JSON string. |
createUser | POST http://localhost:4000/trpc/createUser with req.body of type {name: string} |