Materi
Repositori di memori kehilangan datanya saat server dimulai ulang. SQLite menyimpan data di berkas. Modul node:sqlite memakai pola yang juga dipakai pustaka SQLite lain di Node: db.prepare(sql) membuat pernyataan siap pakai, lalu pernyataan itu dijalankan dengan nilai-nilainya.
import { DatabaseSync } from "node:sqlite";
const db = new DatabaseSync("toko.db");
const perKategori = db.prepare("SELECT id, nama, harga FROM produk WHERE kategori = ?");
perKategori.all("kue"); // larik baris, [] bila tidak ada
const ubahHarga = db.prepare("UPDATE produk SET harga = ? WHERE id = ?");
const info = ubahHarga.run(47000, 2); // { changes, lastInsertRowid }Tanda tanya di SQL adalah parameter. Nilainya dikirim terpisah dari teks SQL, sehingga SQLite tidak pernah membacanya sebagai perintah. Menyambung nilai ke teks SQL dengan template literal membuka SQL injection: nama berisi tanda kutip dan perintah lain ikut menjadi bagian kueri. OWASP menempatkan kueri berparameter sebagai pertahanan utama.
get() memberi satu baris atau undefined, all() memberi larik, dan run() untuk INSERT, UPDATE, dan DELETE memberi changes dan lastInsertRowid, keduanya bisa bertipe number atau bigint. Repositori menerjemahkannya untuk handler: undefined menjadi null untuk 404, Number(lastInsertRowid) menjadi id baru untuk 201, dan changes 0 berarti tidak ada baris yang tersentuh.
Latihan tidak punya SQLite. Kode awal memuat db tiruan yang mencatat setiap SQL dan nilai parameternya lalu menjawab dengan hasil yang disiapkan test, jadi test bisa memeriksa bahwa nilai dikirim sebagai parameter.