今天要來介紹一些 trpc
蠻方便的 Extensions
~昨天完成了 refresh token
的實作,那大家不知道會不會有一個疑問是我要怎麼產生 api
文件讓前端接值呢?,雖然說 trpc
的架構是一個全端框架,但如果你的 api
架構更大,是必須要有文件協助也比較容易 debug
,那今天就來叫紹一款用於 trpc
的 api
文件~
trpc-panel
是一套類似於 swagger
的api UI
介面只需要簡單安裝就可以使用了~
作者來源: https://github.com/iway1/trpc-panel
> npm i trpc-panel
接著新增 panel api route
import type { NextApiRequest, NextApiResponse } from "next";
import { renderTrpcPanel } from "trpc-panel";
import { appRouter } from "../../server/api/root";
export default async function handler(_: NextApiRequest, res: NextApiResponse) {
res.status(200).send(
renderTrpcPanel(appRouter, {
url: "http://localhost:3000/api/trpc",
transformer: "superjson",
})
);
}
拿後打開 http://localhost:3000/api/panel
你就會看到美美的 api
文件拉~
真的是非常方便,甚至你的 router
跟 api method
都幫你分類好了~
這邊就簡單測試一下,執行 getMe
你會發現返回 401
那是因為 getMe
屬於 protect route
所以我們需要先 login
~
login
後會返回 access_token
記得先 copy
~
點選右上角的 Header
然後新增一組 key authorization
把剛剛的 access_token
放進去後勾選 Save Headers
後點選 Confirm
。
這些操作相對於我們在 req.headers
添加 authorization
export const deserializeUser = async (
opt: CreateNextContextOptions
) => {
try {
const { req, res } = opt
let access_token
if (req.headers.authorization) {
access_token = req.headers.authorization
}
之後再點擊 getMe
就成功拿到 user
內容拉~
但現在還有一個問題是,我們的 api
文件沒有註解,所以對於有什麼 param
都不清楚,甚至可能對 api
功能不懂作用,所以我們要加上一些 meta data
內容~
為了讓我們 api
有 meta
記得在 initTRPC
地方加上 TRPCPanelMeta
的 interface
這樣之後的 input
就可以吃到 meta
的 type
。
import { initTRPC } from "@trpc/server";
import { TRPCPanelMeta } from "trpc-panel";
const t = initTRPC.meta<TRPCPanelMeta>().create();
之後可以在每個 procedure
中添加 description
export const authRouter = router({
registerUser:
publicProcedure
.meta({ description: 'register user' })
.input(createUserSchema)
.mutation(async ({ input }) => registerHandler({ input })),
甚至在 createUserSchema
也可以加上。
export const createUserSchema = z.object({
name: z.string({ required_error: 'name is required' }).describe('The user name'),
email: z.string({ required_error: 'email is required' }).email('Invalidate email').describe('register email'),
password: z.string({ required_error: 'password is required' }).describe('user email')
.min(8, { message: 'password must more than 8 characters' })
.max(32, { message: 'password must less than 32 characters' }),
photo: z.string({ required_error: 'profile is require' }).describe('user image url')
})
這樣 registerUser
就有一些 meta info
了~
雖然說 description
部分有點簡陋,可能不像 swagger
或是 postman
那麼完善,但至少目前是堪用的,設定也非常簡單,期待之後套件可以提供更多內容~
另外在 chrome
中可以 install
這套 devtool lib
這樣在你的 console panel
就有 trpc
tab
就會幫你記錄所有 api
內容了。
其實 trpc
的 extensions
東西真的很多筆者只是簡單分享一下,如果讀者有興趣可以去 trpc
官網玩玩看~
https://trpc.io/docs/community/awesome-trpc
https://github.com/iway1/trpc-panel
https://trpc.io/docs/community/awesome-trpc
✅ 前端社群 :
https://lihi3.cc/kBe0Y