Node.js完全初心者が、ファイルを非同期で読み取り、行数をコンソールに出力する方法


Node.js完全初心者が、ファイルを非同期で読み取り、行数をコンソールに出力する方法

こんにちは。ディレクターのエリカです。

こちらは、Node.jsという言葉を聞いて「何となくはわかるけど、実際にどんなものか触ったことがない」という初心者の方に向け、チュートリアル用モジュール「learnyounode」でエクササイズをしていくコーナーの第4回目です。

前回は、ファイルを同期で読み取り行数を出力する問題について紹介しましたが、今回はそれを非同期でおこないます。

Node.jsを勉強したいと思っている人のキッカケや第一歩になれば幸いです。それでは早速はじめていきましょう。

MY FIRST ASYNC I/O! (Exercise 4 of 13)

「learnyounode」のインストールがまだの方は、こちらからどうぞ。

問題

あるファイルを非同期で読み取って、そのファイルの行数をコンソールに出力してください。ちょうど、下記のコマンドと同じような感じになります。

$ cat file | wc -l

なお、実行時にファイルのフルパスを第一引数で与えるものとします。

※ 前回のエクササイズから、ちょうどファイル読み込み部分のみを非同期処理に置き換えることになります。

ヒント

非同期処理を使ってという部分を除けば、前回の問題とほとんど同じになります。
異なる点としては、fs.readFileSync()の代わりにfs.readFile()を用い、結果も引数として与えるコールバック関数を経由するところです。

Node.jsの一般的な手法としては、コールバック関数は以下の形をとります。

function callback (err, data) { /* ... */ }

最初の引数が真かどうかで、エラーをチェックすることができます。もしエラーがなければ、2つ目の引数がBufferオブジェクトになります。

ちなみに、readFile()はreadFileSync()と同様に、2つ目の引数に「utf8」を与え、3つ目にコールバック関数を与えると、BufferオブジェクトではなくStringを受け取ることもできます。

解答

解答例は以下のようになります。

var fs = require('fs')
var file = process.argv[2]

fs.readFile(file, function (err, contents) { // fileの読み込み処理が終わったときに実行される関数を指定
  // fs.readFile(file, 'utf8', callback) can also be used // 読み込みのフォーマットを指定した書き方も可能
  var lines = contents.toString().split('\n').length - 1 // 文字列に変換し改行で配列に分割
  console.log(lines)
})

まとめ

いかがでしたでしょうか?

非同期での処理は、JavaScriptの醍醐味ともいえるかもしれません。
コールバックで随時処理をおこなっていくというやり方に慣れていきましょう。

ちなみに次回の問題にも、非同期での処理を利用することになります。
それでは、お楽しみに!

 

【「learnyounode」エクササイズシリーズ】

  1. Node.js完全初心者向けチュートリアル用モジュール「learnyounode」を使ってみよう
  2. Node.js完全初心者のための、合計値を計算し、コンソールに出力する方法
  3. Node.js完全初心者が、ファイルを同期で読み取り、行数をコンソールに出力する方法
  4. Node.js完全初心者が、ファイルを非同期で読み取り、行数をコンソールに出力する方法
  5. Node.js完全初心者が、ディレクトリを非同期で読み取り、ファイルをコンソールに出力する方法

この記事を書いた人

エリカ
エリカ ディレクター 2012年入社
ディレクターのエリカです。趣味は美術鑑賞で、絵画や展示などたくさんの作品を眺めるのが好きです。得意料理は「鍋」です。よろしくお願いします。