假設我有一個帶有兩組端點的非常基本的 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() }or { input: z.number() },這當然不理想。
對于這個(可能是常見的)用例,檔案和示例似乎非常缺乏,那么這里最好的方法是什么?
uj5u.com熱心網友回復:
此功能已添加到(撰寫時未發布)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://www.uj5u.com/houduan/507663.html
標籤:javascript 打字稿 表示 trpc.io
上一篇:無法獲取路線
