Closed4

HonoでGETは正常なのにPOSTは404 Not Foundエラーが返ってくる

HiraiKyoHiraiKyo

Cloudflare Worker + Honoでルーティングを行っていると、

[wrangler:inf] GET /matchmaking/status 200 OK (2ms)
[wrangler:inf] POST /matchmaking/start 404 Not Found (3ms)

こんな事が起きた。
404 Not Foundなので、エンドポイントが存在しないというエラーだが、Honoで設定してはいる。

HiraiKyoHiraiKyo

Cloudflare WorkerではDurable Objectを使っており、Durable Object内でもHonoを宣言して再度ルーティングするような実装。

index.ts
const app = new Hono();

app.all("/matchmaking/*", async (c) => {
  let id: DurableObjectId;
  id = c.env.MATCHMAKING.idFromName("matchmaking");
  const stub = c.env.MATCHMAKING.get(id);
  const response = await stub.fetch(c.req.url);
  return response;
})
DurableObject/matchmaking.ts
export class MatchmakingDurableObject implements DurableObject {
  app = new Hono();
  constructor(private readonly state: DurableObjectState, env: Env){
    this.app.post("/matchmaking/start", async (c) => {
      // ...
    }
    this.app.get("/matchmaking/status", async (c) => {
      // ...
    }
  }
  fetch(request: Request) {
    return this.app.fetch(request);
  }
}

HiraiKyoHiraiKyo

本当にしょうもないんですが、

index.ts
const response = await stub.fetch(c.req.raw);

こうですね。
Hono.fetch(req: Request)なので、引数はRequest型を取ります。

Github Copilotでササっと書いていて、fetchという名前なのでURLを引数に取るのが自然すぎて見逃していました。

ただ、GETだと正常に機能していた理由がよくわかりませんね。
なんで引数にURL入れて動いたんやろか

このスクラップは2024/04/07にクローズされました