GodLights Study

실습 코드: sample-worker

이 강의의 cloudflare-workers-course/sample-worker/ 디렉터리에 들어 있는 예제 코드입니다. JS 코드는 아래 버튼으로 복사하거나 온라인 컴파일러(Node.js 환경)에서 실행해볼 수 있습니다. 단, env, ctx, Workers KV 같은 Cloudflare Workers 전용 API는 일반 Node.js 샌드박스에서는 동작하지 않으니 로직 확인용으로만 참고하세요.

src/index.js

js
/**
 * Cloudflare Workers 강의용 샘플 워커
 *
 * 라우트:
 *  GET  /            -> 환영 페이지 (HTML)
 *  GET  /api/hello   -> JSON 응답, env 변수 사용 예시
 *  GET  /api/visits  -> Workers KV를 이용한 방문 횟수 카운터
 *  그 외             -> 404 응답
 */
export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);

    if (url.pathname === "/") {
      return new Response(renderHomePage(), {
        headers: { "content-type": "text/html; charset=UTF-8" },
      });
    }

    if (url.pathname === "/api/hello") {
      const body = {
        message: `${env.GREETING ?? "Hello"}, Cloudflare Workers!`,
        timestamp: new Date().toISOString(),
      };
      return Response.json(body);
    }

    if (url.pathname === "/api/visits") {
      return handleVisits(env);
    }

    return new Response("Not Found", { status: 404 });
  },
};

async function handleVisits(env) {
  if (!env.VISITS_KV) {
    return Response.json(
      { error: "VISITS_KV binding이 설정되지 않았습니다. wrangler.jsonc를 확인하세요." },
      { status: 500 }
    );
  }

  const current = await env.VISITS_KV.get("count");
  const next = (Number(current) || 0) + 1;
  await env.VISITS_KV.put("count", String(next));

  return Response.json({ visits: next });
}

function renderHomePage() {
  return `<!doctype html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <title>Cloudflare Workers 샘플</title>
  </head>
  <body style="font-family: sans-serif;">
    <h1>Cloudflare Workers 샘플 프로젝트</h1>
    <ul>
      <li><a href="/api/hello">/api/hello</a></li>
      <li><a href="/api/visits">/api/visits</a></li>
    </ul>
  </body>
</html>`;
}

wrangler.jsonc

json
{
  "$schema": "node_modules/wrangler/config-schema.json",
  "name": "cloudflare-workers-course-sample",
  "main": "src/index.js",
  "compatibility_date": "2024-11-01",
  "vars": {
    "GREETING": "Hello"
  },
  "kv_namespaces": [
    {
      "binding": "VISITS_KV",
      "id": "REPLACE_WITH_YOUR_KV_NAMESPACE_ID"
    }
  ]
}

package.json

json
{
  "name": "cloudflare-workers-course-sample",
  "version": "1.0.0",
  "private": true,
  "description": "Cloudflare Workers 강의용 샘플 프로젝트",
  "scripts": {
    "dev": "wrangler dev",
    "deploy": "wrangler deploy"
  },
  "devDependencies": {
    "wrangler": "^4.0.0"
  }
}