假设我有一个非常基本的API,它有两个端点集。一组查询和更改有关用户的属性(这需要用户名参数),另一组查询和变异有关Post的属性,后者需要post ID。(为了简单起见,让我们忽略身份验证。)我目前还没有找到一种很好的方法来实现这一点。
对我来说,最有意义的是为每一组路线建立一个单独的上下文,如下所示:
// 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文档中找不到在合并时将单独的上下文传递给每个路由器的任何内容。中间件似乎也解决不了这个问题--虽然我可以在中间件中获取post/user并传递它,但我看不到在中间件中需要某种类型的输入的任何方法。我将不得不在每个查询/突变上添加{ input: z.string() }或{ input: z.number() },这当然不是理想的。
对于这个(大概是常见的)用例,文档和示例似乎非常缺乏,那么这里最好的方法是什么呢?
发布于 2022-09-11 22:20:10
此功能已添加到(编写时未发布) 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 }
}),
});https://stackoverflow.com/questions/73675427
复制相似问题