繁体   English   中英

如何在 tRPC 中正确使用上下文?

[英]How to properly use context in tRPC?

假设我有一个非常基本的 API 有两组端点。 一组查询和修改有关用户的属性,这需要用户名参数,一组查询和修改有关帖子的属性,这需要一个帖子 ID。 (为简单起见,让我们忽略身份验证。)我目前看不到以 DRY 方式实现此功能的好方法。

对我来说最有意义的是为每组路由设置一个单独的上下文,如下所示:

// post.ts
export async function createContext(
    opts?: trpcExpress.CreateExpressContextOptions
) {
    // pass through post id, throw if not present
}
type Context = trpc.inferAsyncReturnType<typeof createContext>;

const router = trpc
    .router()
    .query("get", {
        resolve(req) {
            // get post from database
            return post;
        },
    });

// similar thing in user.ts

// server.ts
const trpcRouter = trpc
    .router()
    .merge("post.", postRouter)
    .merge("user.", userRouter);

app.use(
    "/trpc",
    trpcExpress.createExpressMiddleware({
        router: trpcRouter,
        createContext,
    })
);

这抱怨上下文,我在 tRPC 文档中找不到任何关于在合并时将单独的上下文传递给每个路由器的内容。 中间件似乎也不能解决问题——虽然我可以在中间件中获取帖子/用户并将其传递,但我看不出有任何方法需要在中间件中输入某种类型的输入。 我必须在每个查询/突变上抛出{ input: z.string() }{ input: z.number() } ,这当然不理想。

对于这个(可能是常见的)用例,文档和示例似乎非常缺乏,那么这里最好的方法是什么?

此功能已添加到(撰写时未发布)v10。 https://trpc.io/docs/v10/procedures#multiple-input-parsers

const roomProcedure = t.procedure.input(
  z.object({
    roomId: z.string(),
  }),
);
 
const appRouter = t.router({
  sendMessage: roomProcedure
    .input(
      z.object({
        text: z.string(),
      }),
    )
    .mutation(({ input }) => {
      // input: { roomId: string; text: string }
    }),
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM