Open9
tRPCはどんな通信をしているのか
にある examples/express-minimal
配下で実験
git cloneすると結構deprecatedになっている箇所がある。yarn
してyarn start
で動くのでdeprecatedは気にしないことにした。
router抜粋
const helloRouter = t.router({
greeting: t.procedure
.input(z.object({ name: z.string() }).nullish())
.query((arg) => {
console.log(arg);
return `Hello ${arg.input?.name ?? 'World'}`;
}),
});
export const appRouter = t.router({
hello: helloRouter,
});
server
async function main() {
// express implementation
const app = express();
// For testing purposes, wait-on requests '/'
app.get('/', (_req, res) => res.send('Server is running!'));
app.use(
'/trpc',
createExpressMiddleware({
router: appRouter,
createContext: () => ({}),
}),
);
app.listen(3000);
}
localhost:3000/trpc
配下にアクセスするとtrpc routerが動く。
queryとかがどういうパス、リクエストbodyに対応するのか見てみる。
とりあえずyarn startしてサーバが動いている状態にしてからPostmanで雑にlocalhost:3000/trpc
にGETを投げてみた。
以下、レスポンス。
{
"error": {
"message": "No \"query\"-procedure on path \"\"",
"code": -32004,
"data": {
"code": "NOT_FOUND",
"httpStatus": 404,
"stack": "TRPCError: No \"query\"-procedure on path \"\"\n at callProcedure (/Users/xxxx/xxxx/trpc/packages/server/dist/router-da6086c3.js:636:15)\n at (略),
"path": ""
}
}
}
「/というpathにはqueryプロシージャが無い」とのこと。
色々見た結果routerの設定からpathが決まるらしい。
router抜粋
const helloRouter = t.router({
greeting: t.procedure
// ^^^^^^ ここと
.input(z.object({ name: z.string() }).nullish())
.query((arg) => {
console.log(arg);
return `Hello ${arg.input?.name ?? 'World'}`;
}),
});
export const appRouter = t.router({
hello: helloRouter,
// ^^^^^ ここ
});
routerが入れ子になっているかしょは.
で接続される。
従ってlocalhost:3000/trpc/hello.greeting
にアクセスすると以下のレスポンスを得ることができた。
{
"result": {
"data": "Hello World"
}
}
queryのargに値を渡すためにはquery文字列に
input={"key":"value"}
の形でJSONを渡すと認識してくれる。
例えばlocalhost:3000/trpc/hello.greeting?input={"name":"taro"}
でGETリクエストすると
{
"result": {
"data": "Hello taro"
}
}
となる。
ちなみに同じURLにPOSTで投げると
{
"error": {
"message": "No \"mutation\"-procedure on path \"hello.greeting\"",
"code": -32004,
"data": {
"code": "NOT_FOUND",
"httpStatus": 404,
"stack": "TRPCError: No \"mutation\"-procedure on path \"hello.greeting\"\n at (略),
"path": "hello.greeting"
}
}
}
となり、hello.greetingパスにmutationプロシージャが無いよ、というエラーになる。
HTTPメソッドによってrouter内で解決されるhandlerを切り分けているんですね。
ここにほとんど書いてあったというオチ