個人的なNode.jsについてのまとめ

投稿日:2024/12/29 最終更新日:2024/12/29

個人的なNode.jsについてのまとめ

Node.jsでシンプルなサーバーを作成

"use strict";

const port = 3000;
const http = require("http");
const fs = require("fs");

function readFile(file, res) {
  fs.readFile(`./${file}`, (err, data) => {
    if(err) {
      console.error("Not reading file");
    };
    res.end(data);
  });
};

const app = http.createServer((req, res) => {
  if(req.url === "/" && req.method === "GET") {
    res.writeHead(200, {
      "Content-type": "text/html",
    });
    readFile("view/index.html", res);
  } else if(req.url === "/public/image/nodejs.png" && req.method === "GET") {
    res.writeHead(200, {
      "Content-type": "image/png",
    });
    readFile("public/image/nodejs.png", res);
  } else if(req.url === "/public/css/style.css" && req.method === "GET") {
    res.writeHead(200, {
      "Content-Type": "text/css",
    });
    readFile("public/css/style.css", res);
  } else {
    res.writeHead(404, {
      "Content-Type": "text/html",
    });
    res.end(`Not found : ${res.url}`);
    console.log();
  };
});

app.listen(port);
console.log(`The server has started and is listening on port number: ${port}`);

fsモジュール

Node.jsでファイルの読み書きを行うための関数提供用モジュールであり、fsモジュールは同期形式と非同期形式の両方が提供されている。

標準モジュールではnode:fsのようにnode:プリフィックスをつけてインポートすることも可能。

import { readFile } from "node:fs";

非同期APIはfs/promisesというモジュール名で参照できる。

import { readFile } from "node:fs/promises";

※サードパーティー製のモジュールと区別するためにnode:プリフィックスは推奨

fs/promisesモジュールはPromiseを返し、非同期処理が成功した場合は返ってきたPromiseインスタンスがresolveされ、失敗した場合はrejectされる。

import fs from "node:fs/promises";

fs.readFile("sample.js").then(data => {
  // resolveされた場合
  console.log(data);
}).catch(err => {
  // rejectされた場合
  console.error(err);
});

Node.jsはシングルスレッドであり、他処理をブロックしにくい非同期形式のAPIを選ぶことが多く、fs/promisesモジュール以外に非同期APIがたくさんあることは留意すること。

readFile関数

readFile(path[, options])関数はファイルを読み込むための関数。

第1引数には返すファイルを指定、第2引数には文字コードなどのオプションを指定する。

非同期処理を行いたい場合はreadFileSync(path[, options])を使用する。

createServer関数

createServer関数はhttpモジュールで使用できる関数であり、ヘッダー情報や表示コンテンツの設定を行うことでサーバー処理を作成できる。

const http = require('http');
const port = 3000;

const app = http.createServer(function(req, res) {
  // サーバー処理
})

app.listen(port);

reqではURL情報を取得できるためリクエストごとに指定のファイル表示を行うことができる。

また、resはresponseオブジェクトのメソッドであり、ヘッダー情報をレスポンスに書き出すことなどができる。

なので、サンプルではres.writeHead(200, {"Content-type": "image/png"});を作成しており、ステータスコードは200で表示コンテンツは画像形式を指定するなどを設定している。

res.end() はHTTPレスポンスのプロセスを終了する関数であり、正常終了を行うために必要な関数となる。

最後にlisten(port)を使用することで指定ポートでのサーバー待ち受け開始することができる。

listen(0)とするとランダムポートを取得してくれる

Expressで同じ処理のサーバーを作る

const port = 3000;
const express = require("express");
const app = express();

app.use(express.static("static"));

app.get("/", (req, res) => {
  res.writeHead(200);
  res.end();
}); 

app.listen(port);

expressはnpmパッケージをインストールして利用するフレームワーク。

利用はconst app = express();のように簡単に始められる。

先ほどとの違いとしてはapp.use(express.static("static"));のような指定をすることで静的ファイルをフォルダーごと一式読み込むことができる。

そのためapp.get("/", (req, res) => {の処理は分岐処理をする必要がなく、パスに対して自動的にファイルを返してくれる。

参考資料

https://jsprimer.net/use-case/nodecli/read-file/