decolua/9router · info
[DB] node:sqlite unavailable: ${e.message}
Error message
[DB] node:sqlite unavailable: ${e.message} What it means
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.
Source
Thrown at src/lib/db/driver.js:40
try {
const { createBetterSqliteAdapter } = await import("./adapters/betterSqliteAdapter.js");
return createBetterSqliteAdapter(DATA_FILE);
} catch (e) {
console.warn(`[DB] better-sqlite3 unavailable: ${e.message}`);
return null;
}
}
async function tryNodeSqlite() {
// Built-in since Node 22.5.0 — no install needed. Skip under Bun (no node:sqlite).
if (process.versions.bun) return null;
const [maj, min] = process.versions.node.split(".").map(Number);
if (maj < 22 || (maj === 22 && min < 5)) return null;
try {
const { createNodeSqliteAdapter } = await import("./adapters/nodeSqliteAdapter.js");
return await createNodeSqliteAdapter(DATA_FILE);
} catch (e) {
console.warn(`[DB] node:sqlite unavailable: ${e.message}`);
return null;
}
}
async function trySqlJs() {
try {
const { createSqlJsAdapter } = await import("./adapters/sqljsAdapter.js");
return await createSqlJsAdapter(DATA_FILE);
} catch (e) {
console.warn(`[DB] sql.js unavailable: ${e.message}`);
return null;
}
}
async function initAdapter() {
ensureDirs();
// Order per runtime:
// Bun: bun:sqlite → sql.jsView on GitHub (pinned to 90b52e06ff)
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.
Defensive patterns
Strategy: fallback
Validate before calling
const [maj, min] = process.versions.node.split(".").map(Number);
console.log(`node:sqlite ${maj > 22 || (maj === 22 && min >= 5) ? "available" : "unavailable (need Node >= 22.5)"}`); Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- [DB] bun:sqlite unavailable: ${e.message}
- [DB] better-sqlite3 unavailable: ${e.message}
- [DB] No SQLite driver available (bun/better/node/sql.js all
- [DB] sql.js unavailable: ${e.message}
- [DB][sync] add column ${tableName}.${colName} failed: ${e.me
AI-assisted analysis of decolua/9router@90b52e06ff (2026-08-30).
Data as JSON: /api/errors/ca53d99163e650d4.
Report an issue: GitHub.