Node.js 入門: 動かして学ぶチュートリアル
ページ上で実行できる例で学ぶ無料の Node.js 入門です。ファイル、モジュール、イベントループ、リクエストを送れる Express サーバー、MongoDB、JWT を扱います。コードを書き換えてもう一度実行できます。
コースを始めるはじめに
- Node.jsとはNode.jsはブラウザの外、つまりサーバーやターミナルでJavaScriptを動かすランタイムです。言語でもフレームワークでもなく、V8とイベントループ、それにファイル、ネットワーク、プロセスを扱うAPIの組み合わせです。
- Node.jsとJavaScriptの違いJavaScriptは言語で、Node.jsはそれをブラウザの外で動かすプログラムです。構文はまったく同じですが、コードのまわりにあるグローバルや組み込みAPIが違います。
- process.argvprocess.argvは、プログラムを起動したコマンドラインの配列です。nodeの実行ファイル、スクリプトのパス、続いて入力した引数がすべて入っています。自分の引数だけならprocess.argv.slice(2)を使います。
- process.envprocess.envは、Node.jsのプログラムを起動したときの環境変数を持つオブジェクトです。値はすべて文字列かundefinedなので、数値や真偽値は自分で変換し、変数ごとにデフォルト値を用意します。
- ユーザー入力を読むNode.jsにはprompt()関数がありません。ターミナルでユーザーに質問するには、process.stdinにreadlineのインターフェースを作ってquestion()を呼ぶか、readline/promisesでawaitします。
ファイルとパス
- fs.readFileNode.jsでファイルを読むには、fs.readFile(コールバック)、fs.readFileSync、fs/promisesのawait readFileを使います。文字列で受け取るなら'utf8'を渡し、ファイルがないときはENOENTを処理します。
- fs.writeFileNode.jsでファイルに書き込むには、fs.writeFile、fs.writeFileSync、fs/promisesのawait writeFileを使います。ファイルがなければ作られ、あれば置き換えられます。末尾に足すならappendFileを使います。
- fs/promisesfs/promisesはNode.jsのfsモジュールのPromise版です。readFile、writeFile、readdir、stat、mkdir、rm、renameはすべてawaitできるPromiseを返し、エラーはtry/catchで捕まえます。
- pathモジュールpathモジュールは、OSに合ったやり方でファイルパスを組み立てたり分解したりします。path.joinはセグメントをつなぎ、path.resolveは現在のフォルダを起点に絶対パスへ変換します。
非同期の Node
HTTP と Express
- HTTPサーバー`http.createServer()` は、リクエストのたびに `req` と `res` を受け取って動く関数を1つ受け取ります。`req` からメソッドとURLを読み、`res` にステータス、ヘッダー、ボディを設定して `res.end()` を呼びます。
- ExpressのルーティングExpressのルートは、メソッド、パス、ハンドラーの組み合わせです(`app.get('/users/:id', handler)`)。関連するルートは `express.Router()` にまとめ、`app.use('/api', router)` でプレフィックスの下にマウントします。
- ExpressのミドルウェアExpressのミドルウェアは、ルートハンドラーの前に動く `(req, res, next)` の関数です。リクエストを読んだり変えたり、レスポンスを返して終わらせたり、`next()` を呼んで次に渡したりできます。
- req.params、query、body`req.params` はパスの名前付きの部分(`/users/:id`)、`req.query` はクエリ文字列(`?sort=new`)、`req.body` はパースされたリクエストボディを持ちます。`req.body` は `express.json()` のようなボディパーサーを追加するまで `undefined` です。
- エラー処理Expressのエラーハンドラーは、ルートの後に登録する4引数 `(err, req, res, next)` のミドルウェアです。Express 5は、投げられたエラー、`next(err)` の呼び出し、asyncハンドラーからのrejectされたPromiseをそこへ送ります。
- express.static`app.use(express.static(path.join(__dirname, 'public')))` は、`public` フォルダのすべてのファイルを対応するURLで配信します。`public/style.css` は `/style.css` に答えます。プレフィックスの下で配信するならマウントパスを付けます。
- ExpressのCORSCORSエラーは、レスポンスがページのオリジンを許可していなかったために、ブラウザがAPIのレスポンスをページに読ませなかったことを意味します。手書きか `cors` パッケージで、`Access-Control-Allow-Origin` を送り、プリフライトの `OPTIONS` リクエストに答えて、サーバー側で直します。