{"record":{"id":"ca53d99163e650d4","repo":"decolua/9router","slug":"db-node-sqlite-unavailable-e-message","errorCode":null,"errorMessage":"[DB] node:sqlite unavailable: ${e.message}","messagePattern":"\\[DB\\] node:sqlite unavailable: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"info","filePath":"src/lib/db/driver.js","lineNumber":40,"sourceCode":"  try {\n    const { createBetterSqliteAdapter } = await import(\"./adapters/betterSqliteAdapter.js\");\n    return createBetterSqliteAdapter(DATA_FILE);\n  } catch (e) {\n    console.warn(`[DB] better-sqlite3 unavailable: ${e.message}`);\n    return null;\n  }\n}\n\nasync function tryNodeSqlite() {\n  // Built-in since Node 22.5.0 — no install needed. Skip under Bun (no node:sqlite).\n  if (process.versions.bun) return null;\n  const [maj, min] = process.versions.node.split(\".\").map(Number);\n  if (maj < 22 || (maj === 22 && min < 5)) return null;\n  try {\n    const { createNodeSqliteAdapter } = await import(\"./adapters/nodeSqliteAdapter.js\");\n    return await createNodeSqliteAdapter(DATA_FILE);\n  } catch (e) {\n    console.warn(`[DB] node:sqlite unavailable: ${e.message}`);\n    return null;\n  }\n}\n\nasync function trySqlJs() {\n  try {\n    const { createSqlJsAdapter } = await import(\"./adapters/sqljsAdapter.js\");\n    return await createSqlJsAdapter(DATA_FILE);\n  } catch (e) {\n    console.warn(`[DB] sql.js unavailable: ${e.message}`);\n    return null;\n  }\n}\n\nasync function initAdapter() {\n  ensureDirs();\n  // Order per runtime:\n  //   Bun:  bun:sqlite → sql.js","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/decolua/9router/blob/90b52e06ffd666b7929554211474d01588f6b1f8/src/lib/db/driver.js#L22-L58","documentation":"Third link in the driver fallback chain. tryNodeSqlite uses the built-in node:sqlite module (available since Node 22.5.0, skipped under Bun); if the version gate passes but the adapter import/init fails, it logs this warning and returns null so the chain ends with sql.js.","triggerScenarios":"Node >= 22.5 where createNodeSqliteAdapter throws: node:sqlite experimental-flag issues on very new Node versions, corrupt or locked DATA_FILE, unwritable data directory, or a Node build compiled without SQLite support.","commonSituations":"Node 22.5-22.x where node:sqlite still required --experimental-sqlite (pre-22.13 / pre-23.4 flag era); corrupted DB file after a crash; running inside a restricted sandbox.","solutions":["Upgrade Node to a version where node:sqlite is stable/unflagged (>= 22.13 or 23.x+).","Check e.message: SQLITE_CORRUPT / file errors mean inspect the DB file and its directory permissions.","Rely on the sql.js fallback if present — the app still works, just slower (pure JS).","Alternatively npm install to get better-sqlite3 working so the chain never reaches node:sqlite."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"const [maj, min] = process.versions.node.split(\".\").map(Number);\nconsole.log(`node:sqlite ${maj > 22 || (maj === 22 && min >= 5) ? \"available\" : \"unavailable (need Node >= 22.5)\"}`);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use Node >= 22.13 (or 23.x) where node:sqlite no longer needs an experimental flag.","Check node -e \"require('node:sqlite')\" during deployment smoke tests.","Keep better-sqlite3 healthy so node:sqlite is rarely exercised.","Watch startup logs for the [DB] Driver: line to know which driver actually loaded."],"tags":["sqlite","node","driver-fallback","database"],"backgroundTag":"sqlite-driver-unavailable","analyzedSha":"90b52e06ffd666b7929554211474d01588f6b1f8","analyzedAt":"2026-08-30T21:05:45.952Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}