Menu
CoddyTech

コールバック

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の次の行は、ファイルの読み込み中に実行されるからです。

challenge icon

チャレンジ

簡単

このレッスンでは、「エラーの処理」で使ったノートツールのファイルではなく、新しいコールバックによる件数カウントの例としてcount.jsを開きます。用意されているnotes.json、notes.js、store.jsが含まれています。これまでの作業は、元のレッスンに保存されたままです。

大きなファイルを読み込むには時間がかかります。コールバックを使うと、その間Nodeはほかの作業を行い、ファイルの準備ができたときにあなたのコードを呼び出します。ファイル内のノート数を数える小さな別プログラム、count.jsで練習しましょう。

  1. count.jsはすでにReading...を表示し、読み込むファイルも把握しています。fileはnode count.jsの後に入力した単語で、何も入力しなかった場合はnotes.jsonです。
  2. fs.readFileとコールバックを使って、そのファイルを読み込みます。以下の処理はすべてコールバックの中で行います。
  3. 読み込みに成功したら、JSON.parseを使ってテキストを配列に変換します。配列に含まれるノートの数を、続けて notesと表示します。ファイルの行数ではなく、配列内のノートを数えます。notes.jsonには最初からノートが2つあるので、2 notesと表示します。
  4. 読み込みに失敗した場合、つまりコールバックのエラーがnullではない場合は、件数の代わりにCannot read に続けてファイル名を表示します。
  5. どちらの場合も、コールバックの中で最後にDoneを表示します。

node count.jsを実行すると、次のように表示されます。

Reading...
2 notes
Done

node 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を表示する。
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Node.jsの基礎のすべてのレッスン

自分で練習してみよう: Expressプレイグラウンド