Zenn
Open4

Hono & Cloudflare Workers で Scheduled Handler が動かない

ピン留めされたアイテム
moriyuumoriyuu

結論

worker.ts 側で scheduled handler を export したら動いた

// server/index.ts
...

// scheduled 単体で export しておく
export const scheduled: ExportedHandlerScheduledHandler<Env> = async (
  event,
  env,
  ctx,
) => {
  async function run() {...}
  ctx.waitUntil(run());
};

// ここでは fetch, scheduled ハンドラーを個別に export しない
export default app;
// worker.ts
import handle from "hono-react-router-adapter/cloudflare-workers";
import * as build from "./build/server";
import { getLoadContext } from "./load-context";
import app, { scheduled } from "./server";

const app2 = handle(build, app, { getLoadContext });

export default {
  fetch: app2.fetch,
  scheduled,
};
moriyuumoriyuu

Handler does not export a scheduled() function となってしまう

moriyuumoriyuu

環境

hono & cloudflare workers の上で react router v7 を動かしたかったので、hono-react-router-adapter を使っており、フォルダ構成などはこの example を参考に作っていた
https://github.com/yusukebe/hono-react-router-adapter/tree/main/examples/cloudflare-workers

そして、scheduled handler を動かすために server/index.ts は下の記事を参考にこのように書いていた

// server/index.ts
...

export default {
  fetch: app.fetch,
  scheduled,
};

https://hono.dev/docs/getting-started/cloudflare-workers#using-hono-with-other-event-handlers
https://zenn.dev/toraco/articles/55f359cbf94862#hono-を利用しているプロジェクトに-cron-triggers-を統合する

moriyuumoriyuu

hono-react-router-adapter の handle が、新しい Hono インスタンスに我々 (ユーザー) の渡した Hono インスタンス (userApp) と react router を載せるという実装だったためっぽい。
server/index.ts で scheduled handler を export してても hono-react-router-adapter 側に上書きされちゃう、みたいな。

https://github.com/yusukebe/hono-react-router-adapter/blob/71d6549b343a57fad0685f36c1540a0778f1e805/packages/hono-react-router-adapter/src/handlers/cloudflare-workers.ts#L12-L27

ログインするとコメントできます