문제와 원인
Worker의 fetch가 받은 요청 환경에는 DB가 있었지만, DB 모듈이 별도로 import한 환경에는 바인딩이 비어 있었다. 학습 API가 getDb()를 호출하면 Drizzle 연결 전에 바인딩 누락 오류가 발생했다.
수정 전 코드
fetch
좌우로 이동해 전체 내용을 확인하세요. 키보드: ←·→, Home·End
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
const url = new URL(request.url);
getDb
좌우로 이동해 전체 내용을 확인하세요. 키보드: ←·→, Home·End
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 접근보다 먼저 요청 환경을 등록했다.
좌우로 이동해 전체 내용을 확인하세요. 키보드: ←·→, Home·End
// worker/index.ts의 fetch 진입점
globalThis.__SQLP_STUDY_ENV__ = env;
getDb
getDb()는 등록된 환경의 DB를 읽어 Drizzle에 전달한다. 바인딩이 없으면 기존 오류를 발생시킨다.
좌우로 이동해 전체 내용을 확인하세요. 키보드: ←·→, Home·End
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 대역이 호출 횟수와 전달 인자를 기록했다.
좌우로 이동해 전체 내용을 확인하세요. 키보드: ←·→, Home·End
| 항목 | 수정 전 | 수정 후 |
|---|---|---|
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가 표시됐다.