コールバック
CoddyのNode.jsジャーニー「Node.jsの基礎」セクションの一部。レッスン 18/33。
大きなファイルを読み込むには時間がかかり、その間、読み込みを待つプログラムはほかの処理を何もしません。
fs.readFile(path, 'utf8', callback)は読み込みを開始し、すぐに戻ります。ファイルの読み込みが完了すると、Nodeは(err, text)を渡してコールバックを呼び出します。成功時にはerrはnullで、それ以外の場合はエラーになるため、まず確認してください。テキストを必要とする処理はすべてコールバックの中に記述します。
import fs from 'node:fs';
fs.readFile('poem.txt', 'utf8', (err, text) => {
if (err) {
console.log('No poem today');
return;
}
console.log(text.split('\n').length + ' lines');
});
console.log('Asked for the poem');Asked for the poemが最初に表示されます。readFileの次の行は、ファイルの読み込み中に実行されるからです。
チャレンジ
簡単このレッスンでは、「エラーの処理」で使ったノートツールのファイルではなく、新しいコールバックによる件数カウントの例としてcount.jsを開きます。用意されているnotes.json、notes.js、store.jsが含まれています。これまでの作業は、元のレッスンに保存されたままです。
大きなファイルを読み込むには時間がかかります。コールバックを使うと、その間Nodeはほかの作業を行い、ファイルの準備ができたときにあなたのコードを呼び出します。ファイル内のノート数を数える小さな別プログラム、count.jsで練習しましょう。
count.jsはすでにReading...を表示し、読み込むファイルも把握しています。fileはnode count.jsの後に入力した単語で、何も入力しなかった場合はnotes.jsonです。fs.readFileとコールバックを使って、そのファイルを読み込みます。以下の処理はすべてコールバックの中で行います。- 読み込みに成功したら、
JSON.parseを使ってテキストを配列に変換します。配列に含まれるノートの数を、続けてnotesと表示します。ファイルの行数ではなく、配列内のノートを数えます。notes.jsonには最初からノートが2つあるので、2 notesと表示します。 - 読み込みに失敗した場合、つまりコールバックのエラーが
nullではない場合は、件数の代わりにCannot readに続けてファイル名を表示します。 - どちらの場合も、コールバックの中で最後に
Doneを表示します。
node count.jsを実行すると、次のように表示されます。
Reading...
2 notes
Donenode count.js nothere.jsonを実行すると、次のように表示されます。
Reading...
Cannot read nothere.json
Done試してみましょう:このレッスンではcount.jsを実行するため、ターミナルには$ node count.jsと表示されます。入力欄を空のままにして「実行」を押すと、プログラムはnotes.jsonを読み込みます。次に、入力欄にnothere.jsonと入力してEnterキーを押し、存在しないファイルを読み込んでみましょう。
自分で試してみよう
import fs from 'node:fs';
const file = process.argv[2] ?? 'notes.json';
console.log('Reading...');
// fs.readFileとコールバックを使ってファイルを読み込む。
// ノートの数を表示し、次にDoneを表示する。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Node.jsの基礎のすべてのレッスン
自分で練習してみよう: Expressプレイグラウンド