Worker가 받은 DB 바인딩을 Drizzle까지 전달하지 못한 오류

이 글의 목차 8개 항목

문제와 원인

Worker의 fetch가 받은 요청 환경에는 DB가 있었지만, DB 모듈이 별도로 import한 환경에는 바인딩이 비어 있었다. 학습 API가 getDb()를 호출하면 Drizzle 연결 전에 바인딩 누락 오류가 발생했다.

수정 전 코드

fetch

async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
  const url = new URL(request.url);

getDb

import { env } from "cloudflare:workers";
import { drizzle } from "drizzle-orm/d1";
import * as schema from "./schema";

export function getDb() {
  if (!env.DB) {
    throw new Error(
      "Cloudflare D1 binding `DB` is unavailable. Set the `d1` field in .openai/hosting.json to `DB` or let your control plane inject the real binding values before using the database."
    );
  }
  return drizzle(env.DB, { schema });
}

수정 후 코드

fetch

Worker 진입점에서 DB 접근보다 먼저 요청 환경을 등록했다.

// worker/index.ts의 fetch 진입점
globalThis.__SQLP_STUDY_ENV__ = env;

getDb

getDb()는 등록된 환경의 DB를 읽어 Drizzle에 전달한다. 바인딩이 없으면 기존 오류를 발생시킨다.

const binding = globalThis.__SQLP_STUDY_ENV__?.DB;
if (!binding) {
  throw new Error(
    "Cloudflare D1 binding `DB` is unavailable. Set the `d1` field in .openai/hosting.json to `DB` or let your control plane inject the real binding values before using the database."
  );
}
return drizzle(binding, { schema });

검증 결과

Node.js에서 원본 전후 getDb()를 각 1회 실행했다. 요청 환경은 env={DB}, import 환경은 빈 객체인 합성 입력이며, Drizzle 대역이 호출 횟수와 전달 인자를 기록했다.

항목수정 전수정 후
getDb() 실행 성공0/1회1/1회
Drizzle 호출0회1회
요청 DB 객체와 Drizzle 인자의 동일성전달 실패동일한 객체

같은 원본 함수와 대역을 사용하는 로컬 HTTP 경로를 Swagger UI·1280×720 CSS px·DPR 2에서 1회 요청했다. HTTP 200 응답에 수정 전 성공 false·Drizzle 0회, 수정 후 성공 true·Drizzle 1회·객체 동일성 true가 표시됐다.

getDb 비교 응답: 성공 false에서 true·Drizzle 0회에서 1회·같은 요청 DB 전달원본 보기 (새 창)

getDb 비교 응답: 성공 false에서 true·Drizzle 0회에서 1회·같은 요청 DB 전달

100%원본 보기 (새 창)

확대한 이미지는 상하좌우로 이동할 수 있습니다. 키보드는 이미지 영역에 초점을 두고 방향키를 사용하세요. Esc로 닫습니다.