ファイルを読み書きする
プログラムが終わると配列は消える
ここまで商品データは配列に書いていました。ですが node app.js が終わった瞬間、その配列はメモリごと消えます。次に起動したときには、また同じ初期データから始まります。
フリマアプリとしては困ります。出品した商品が、サーバーを再起動したら消えてしまうからです。プログラムの外に残す必要があります。
最初の手段はファイルです。
fs はファイルを扱う道具箱
Node.js には fs という部品が最初から入っています。npm で入れる必要はありません。ファイルシステムの略です。
JavaScript
const fs = require("fs/promises");
const raw = await fs.readFile("items.json", "utf8");utf8 を渡すのを忘れないでください。指定しないと、人が読めない形の生のデータが返ってきます。文字として読みたいことを伝える指定です。
書くときは writeFile です。
JavaScript
await fs.writeFile("items.json", "保存したい文字列");fs/promises と fs の違い
require("fs") と require("fs/promises") の 2 つがあります。
| 読み込み方 | 使い方 |
|---|---|
fs/promises | await を付けて待つ |
fs | readFileSync のように末尾が Sync のものを使う |
このコースでは fs/promises を使います。ファイルの読み書きは時間がかかる作業で、待っているあいだに他の仕事を進められるほうが、サーバーとしては都合がよいからです。第3章でサーバーを立てると、その意味がはっきりします。
書き込みは上書き
writeFile は追記ではありません。同じ名前のファイルがあれば、中身をまるごと差し替えます。
ですから商品を 1 件足したいときは、次の順番になります。
- いまのファイルを読む
- 読んだものに 1 件足す
- 全部をもう一度書き込む
読まずにいきなり書くと、それまでの商品が消えます。
手を動かす
演習では、商品の配列をファイルに保存して、そのファイルを読み直すところまでを書きます。渡された配列を直接見るのではなく、いったんファイルを経由するのが要点です。読み書きが 1 往復できることを、自分の手で確かめてください。
要件
fs/promisesを使い、受け取った場所へ配列を JSON の文字列として書き込む- 書き込んだあと、同じファイルを
utf8で読み直す - 読み直した内容から先頭の商品の
nameを返す(空のときは商品がありません)
入出力例
saveAndReload([{"id":1,"name":"レザースニーカー"},{"id":2,"name":"古着のデニムジャケット"}], "/tmp/fleama-fs-a.json") → "レザースニーカー"
saveAndReload([{"id":1,"name":"木製のスツール"}], "/tmp/fleama-fs-b.json") → "木製のスツール"
saveAndReload([], "/tmp/fleama-fs-c.json") → "商品がありません"ヒント
編集 ゆめさく編集部