動かざることバグの如し

近づきたいよ 君の理想に

Node.js v12でasync/awaitだけでファイルの読み書きをする

結論

正式なLTSになってるわけじゃないけど、本番投入に問題ない仕上がりにはなってる

Node.js v12 でfs/promisesがexperimentalでなくなった件

Node.js10からfs Promises APIが実装された。

が、実行すると、

ExperimentalWarning: The fs/promises API is experimental

のようにExperimentalである旨が表示される。ファイルの読み書きはコールバックなしで読みやすく書きたいよね、とは思いつつ、実際重要な機能だしExperimentalだとちょっと本番適用厳しいなぁって感じだった。

しかし12(LTS予定)ではExperimentalが外されている。(詳しく言うとv11ですでにStableになった

ってことで偶数バージョンである12で晴れてasync/awaitでfsが使える!!(念願

サンプルコード

めっちゃシンプルにした。これだけで読み書き可能

const fs = require('fs').promises;

(async () => {
  const filename = 'newfile.txt';
  await fs.writeFile(filename, Date.now());
  const message = await fs.readFile(filename, 'utf-8');
  console.log(message);
})()

ロード

今まで

const fs = require('fs');

だったのが

const fs = require('fs').promises;

になる

書き込み

第1引数に保存したいファイル名、第2引数に書き込みたい内容 ここには載せてないが、第3引数を {} で渡すことでオプションを渡せる(詳しくは公式ドキュメント参照

読み込み

これも第1引数にファイル名 注意点として、第2引数に文字エンコードを指定しないと文字列ではなくBufferクラスが返ってきてしまう。

await fs.readFile(filename, 'utf-8');

他にも渡したいオプションが有るなら、以下のように{}で渡すこともできる

await fs.readFile(filename, {encoding: 'utf-8'});