つくる:データ層
新しいことは出てきません
この回では、新しい知識は 1 つも出てきません。第2章で書いたものを 1 つにまとめて、fleama のデータ層を作ります。
データ層とは何か
データ層とは、データの出し入れだけを引き受ける場所のことです。ここまでバラバラに書いてきた「読む」「足す」「絞り込む」を、1 つのファイルにまとめます。
JavaScript
// data.js
async function readItems(filePath) { /* 読む */ }
async function writeItems(filePath, items) { /* 書く */ }
module.exports = { readItems, writeItems };分けておくと何がよいのか。第6章で、この中身をまるごとデータベースに差し替えます。そのとき呼び出す側は 1 行も変えずに済みます。読む・書くという約束だけが外に出ていて、それをどう実現するかは中に隠れているからです。
これが第2章で module.exports を学んだ理由です。
ここまでに手に入れたもの
| 何を | どのレッスンで |
|---|---|
| ファイルを分けて出し入れする | import/export |
| ファイルを読み書きする | ファイルを読み書きする |
| 待つ必要のある処理をつなぐ | async/await復習 |
| 文字列とデータを行き来する | JSONの取り回し |
消えないことが最初の価値
第1章で作ったプロジェクトは、動かすたびに同じ初期データから始まりました。データ層ができると、出品した商品が次の起動でも残ります。
次の第3章では、いよいよサーバーが立ちます。そのサーバーが返すデータの出どころが、いま作っているこの層です。
手を動かす
演習では、読む・足す・保存するをまとめた関数を作ります。第2章のすべてが 1 つにつながります。
要件
initialをファイルへ書いてから読み直し、newItemsを先頭から順に末尾へ足す- 足し終えた配列をファイルへ書き戻す
items(全商品)count(件数)availableNames(soldがtrueでない商品の名前の配列) を持つオブジェクトを返す
入出力例
buildDataLayer("/tmp/fleama-layer-a.json", [{"id":1,"name":"レザースニーカー","sold":false}], [{"id":2,"name":"古着のデニムジャケット","sold":false},{"id":3,"name":"木製のスツール","sold":true}]) → {"availableNames":["レザースニーカー","古着のデニムジャケット"],"count":3,"items":[{"id":1,"name":"レザースニーカー","sold":false},{"id":2,"name":"古着のデニムジャケット","sold":false},{"id":3,"name":"木製のスツール","sold":true}]}
buildDataLayer("/tmp/fleama-layer-b.json", [], [{"id":1,"name":"レザースニーカー","sold":false}]) → {"availableNames":["レザースニーカー"],"count":1,"items":[{"id":1,"name":"レザースニーカー","sold":false}]}
buildDataLayer("/tmp/fleama-layer-c.json", [{"id":1,"name":"木製のスツール","sold":true}], []) → {"availableNames":[],"count":1,"items":[{"id":1,"name":"木製のスツール","sold":true}]}ヒント
編集 ゆめさく編集部