出品をDB化
書き込みは run で行う
読み出しの get と all に続いて、書き込みの run を使います。
JavaScript
const result = db
.prepare("INSERT INTO items (name, price) VALUES (?, ?)")
.run("レザースニーカー", 4800);? の場所に、run に渡した値が順番どおりに入ります。この ? をプレースホルダと呼びます。次のレッスンで、これが単なる書き方の都合ではないことを見ます。
id はデータベースが決める
第4章では「最大の id + 1」を自分で計算していました。表を AUTOINCREMENT で作っておけば、その計算は要りません。
JavaScript
const result = db.prepare("INSERT INTO items (name, price) VALUES (?, ?)").run(name, price);
const newId = result.lastInsertRowid;lastInsertRowid に、いま入った行の id が返ります。
自分で計算しないほうが安全です。2 人が同時に出品したとき、自分で計算する方式だと両方が同じ id を掴むことがあります。データベースに任せれば、そこは正しく捌かれます。
数として扱う
lastInsertRowid は、とても大きな数まで扱える特別な形で返ります。そのまま JSON にすると扱いにくいので、数値に直します。
JavaScript
const newId = Number(result.lastInsertRowid);入れたものを返す
登録の応答には、作られたものを返します。id が決まるのは登録した後なので、入れてから読み直すのが確実です。
JavaScript
const newId = Number(result.lastInsertRowid);
const created = db.prepare("SELECT id, name, price FROM items WHERE id = ?").get(newId);
res.status(201).json(created);手元の値から組み立てても同じに見えますが、DEFAULT 0 のようにデータベース側が決めた値は読み直さないと分かりません。
検証は変わらず入り口で
第5章で書いた検証は、そのまま前に残します。
JavaScript
if (!req.body.name) {
return res.status(400).json({ error: "商品名は必須です" });
}データベースにも制約は付けられますが、おかしな入力は入り口で止めるのが先です。400 で理由を返すほうが、送った側にとって分かりやすくなります。
手を動かす
演習では、出品をデータベース書き込みに置き換えます。id はデータベースに決めさせてください。
要件
nameが空なら 400 で{"error":"商品名は必須です"}を返すINSERTはプレースホルダ?を使い、id はAUTOINCREMENTに任せる- 入った id で読み直した
{id, name, price, sold}を 201 で返す
入出力例
request("POST", "/items", {"name":"木製のスツール","price":3500}) → "201 {"id":2,"name":"木製のスツール","price":3500,"sold":0}"
request("POST", "/items", {"name":"","price":3500}) → "400 {"error":"商品名は必須です"}"
request("GET", "/items") → "200 [{"id":1,"name":"レザースニーカー","price":4800,"sold":0}]"ヒント
編集 ゆめさく編集部