Node.jsでHTTP Webサーバーを作成する Code 例:

⚡ スマートサマリー

Node.jsは、組み込みのhttpモジュールを使用して、わずか数行のコードで動作するWebサーバーを構築します。サーバーは指定されたポートで待機し、各リクエストに対してステータスコードとレスポンスボディで応答します。一方、別のコードが他のサイトからデータを取得します。

  • 甘いもの<XNUMXxXNUMX><XNUMXxXNUMX><XNUMXxAXNUMX><XNUMXxAXNUMX>️️ サーバー作成: http.createServer は、受信リクエストごとに一度実行され、リクエストオブジェクトとレスポンスオブジェクトを受け取るコールバックを登録します。
  • 🔢 ステータスとヘッダー: writeHeadは、本文コンテンツが書き込まれる前に、ステータスコードとContent-Typeを送信します。
  • 🔌 ポートバインディング: server.listenはアプリケーションをポートに接続します。任意の空いているポート番号を選択できます。
  • 📥 送信リクエスト: 別のサイトからデータを取得するにはHTTPクライアントが必要ですが、Node.jsには現在、グローバルなフェッチ関数が標準で搭載されています。
  • ⚠️ 非推奨のクライアント: requestモジュールは2020年2月に非推奨となり、新しいコードでは使用しないでください。
  • 🛠️ 起動失敗: EADDRINUSEエラーは、選択されたポートが既に別のプロセスによって使用されていることを意味します。

Node.js で HTTP Web サーバーを作成する

その Node.js このフレームワークは主にサーバーベースのアプリケーションを作成するために使用されます。ユーザーにコンテンツを提供するWebサーバーを簡単に構築できます。

サーバー関連のリクエストを処理するモジュールがいくつかあり、組み込みの http 中でも最も重要なモジュールは、Node.js を使用した基本的な Web サーバー アプリケーションの作成方法、そして別のサイトからデータを要求する方法についてです。

HTTPを使用したWebサーバーとしてのノード

それでは、最初のNode.jsアプリケーションを作成して実行する方法の例を見てみましょう。

アプリケーションは、ポート 7000 でリッスンするシンプルなサーバー モジュールを作成します。ブラウザからそのポートでリクエストが行われると、サーバーは こんにちは世界 顧客への対応。

HTTPを使用したWebサーバーとしてのノード

Code 説明

  1. その require 関数は、 Javaスクリプト ファイルを実行し、エクスポートオブジェクトを返します。ここで、 http モジュール化することで、その機能がアプリケーション内で利用可能になります。
  2. サーバーアプリケーションは、シンプルな関数から作成されます。その関数は、リクエストがサーバーに到達するたびに実行されます。
  3. リクエストが受信されると、レスポンスはステータスとともに送信されます。 200これは、HTTPヘッダーにおける正常な応答を示す標準的なステータスコードです。
  4. レスポンスボディ自体は文字列です こんにちは世界.
  5. server.listen アプリケーションはポート7000でクライアントからのリクエストを待ち受けます。使用可能なポートであればどれでも使用できます。

コマンドが正常に実行されると、ブラウザに以下の出力が表示されます。

出力

Nodeウェブサーバーの出力

出力結果より:

  • localhostにアクセスしています URL ポート7000では文字列が表示されます こんにちは世界 ページ内で。
  • コードがポート7000を指定しているため、出力はそのポートにアクセスした場合にのみ表示されます。

参考までにコードを以下に示します。

var http = require('http');

var server = http.createServer(function(request, response) {
    response.writeHead(200, { "Content-Type": "text/plain" });
    response.end("Hello World\n");
});

server.listen(7000);

Node.js での GET リクエストの処理

Node.js では、別のサイトからデータを取得するために GET リクエストを行うのは簡単です。従来は、 request コマンドラインからインストールされたモジュール:

npm install request

このコマンドは、Node パッケージマネージャに必要なモジュールをダウンロードしてインストールするように指示します。インストールが成功すると、コマンドラインにインストールされたモジュール名とバージョンが次の形式で表示されます。 <name>@<version>.

npm install リクエストの出力

上記のスナップショットでは、 request モジュールとそのバージョン番号がダウンロードされ、インストールされました。

Node.jsでGETリクエストを作成する

Code 説明

  1. その request 前の手順でインストールしたモジュールは、ウェブサイトへのGETリクエストを行うために必要な機能を提供します。
  2. GETリクエストがサイトに送信され、レスポンスが到着するとコールバックが実行されます。コールバックは3つのパラメータを受け取ります。
    1. エラー — リクエスト中に発生したエラーを記録します。
    2. 世界の動き — レスポンスとともに返されるHTTPヘッダーを運びます。
    3. ボディ — レスポンスの全内容が含まれています。
  3. 受信したコンテンツ body パラメータがコンソールに書き込まれます。

参考までにコードを以下に示します。

var request = require("request");

request("https://example.com", function(error, response, body) {
    // Always check the error parameter before using the body
    if (error) {
        console.error("Request failed:", error.message);
        return;
    }
    console.log(body);
});

⚠️ 廃止のお知らせ:   request モジュールは 2020年2月に完全に廃止されました そして、それ以降はアップデートされません。それでもインストールと実行はできるので、上記の例は既存のプロジェクトには有効ですが、 npm install request 非推奨警告が表示されるようになりました。新しいコードでは組み込みの機能を使用する必要があります。 fetch 次のセクションでその機能を示します。

Node.jsでネイティブのfetchを使用してHTTPリクエストを行う方法

Node にはグローバル fetch バージョン18以降、ブラウザが既に提供しているAPIと一致する関数です。パッケージのインストールは不要で、関数はPromiseを返すため、直接動作します。 async/await.

// No require and no npm install needed on Node 18 or later

async function getData() {
    try {
        const response = await fetch("https://example.com");

        // fetch does NOT reject on 404 or 500 — check ok yourself
        if (!response.ok) {
            throw new Error("HTTP status " + response.status);
        }

        const body = await response.text();
        console.log(body);

    } catch (err) {
        // Network failures and the throw above both land here
        console.error("Request failed:", err.message);
    }
}

getData();

コールバック方式との3つの違いに注目する価値がある。まず、 fetch ネットワークレベルの障害でのみ拒否します。HTTP 404 または 500 は引き続き正常に解決されるため、 response.ok チェックが存在すること、そして移行時にそれを省略することが最も一般的な間違いである理由 request第二に、本文はレスポンスとともに配信されないため、明示的に読み取る必要があります。 response.text() プレーンテキストまたは response.json() JSON の場合、それぞれが独自のプロミスを返します。第三に、呼び出し全体がプロミスベースであるため、単一の try/catch リクエストと読み取られたボディの両方を対象とし、エラー優先のコールバックパラメータを完全に置き換えます。

Node 16以前のバージョンで実行する必要があるスクリプトの場合は、 node-fetch or axios その代わりに、どちらも同等のプロミスベースのインターフェースを公開しており、ランタイムがアップグレードされた後にインポート行を変更するだけで済むため、

request、fetch、axios:どれを使うべきか?

ほとんどのNode関連資料には3種類のHTTPクライアントが登場しますが、新規開発においてデフォルトとして適切なのはそのうちの1種類だけです。これらのクライアントは、メンテナンス状況、依存関係の必要性、エラー状態の通知方法などが異なるため、以下の表で比較しています。

側面 要求 フェッチ(組み込み) アクシオス
ステータス 2020年以降非推奨 コアで維持 積極的に維持されている
設置 npmパッケージ ノード18+には該当なし npmパッケージ
形式 エラー発生時のコールバック 約束 約束
JSON解析 手動、またはJSONオプション response.json() による手動操作 オートマチック
404または500エラーで拒否 いいえ いいえ はい

  fetch Nodeの最新バージョンでの新規プロジェクトの場合、依存関係を追加せず、開発者が既に知っているブラウザAPIと一致するため、これを選択します。 axios 自動JSON処理、リクエストインターセプター、またはエラー状態による拒否によって実際のコードを削減できる場合。 request 既にそれに依存しており、それを置き換える予定の既存アプリケーション内でのみ使用されます。

Node.jsサーバーでよく発生するエラーとその解決方法

初めてNodeサーバーを起動する際の失敗のほとんどは、サーバーコード自体ではなく、ポート、パス、または応答の欠如に起因します。

  • EADDRINUSE: 別のプロセスが既にポートを占有しています。 netstat -ano | findstr :7000 on Windowsまたは lsof -i :7000 on macOS Linuxの場合は、そのプロセスを停止するか、別のポートを選択してください。
  • 低ポートでのEACCES: 1024番未満のポートを使用するには、管理者権限が必要です。開発中は、3000番や7000番など、1024番より大きいポートを使用してください。
  • ブラウザがフリーズして、読み込みが完了しない。 ハンドラーは呼び出しをしなかった response.end()接続はタイムアウトするまで開いたままなので、ハンドラを通るすべてのパスは応答を終了させる必要があります。
  • モジュール「http」が見つかりません。 ファイル名にスペルミスがあるか、スクリプトがNodeではなくブラウザで実行されています。コアモジュールはインストール不要です。
  • 変更は表示されません。 Node は起動時に一度だけファイルを読み込みます。編集後は毎回プロセスを再起動するか、次のようなウォッチャーの下で実行してください。 node --watch server.js.

よくあるご質問

単一のエンドポイントであれば、httpモジュールで十分です。Expressはルーティング、ミドルウェア、ボディ解析機能を追加するため、アプリケーションが複数のルートを処理するようになると、これらの機能に依存する価値が出てきます。

要求する https 代わりにモジュールを使用して、キーと証明書をcreateServerに渡します。本番環境では、通常、NginxなどのリバースプロキシがTLSを終端し、プレーンなHTTPをNodeに転送します。

Yes. AI エラー優先のコールバックを確実に非同期の await に変換するツールがあります。生成されたコードに response.ok テストが追加されていることを確認してください。fetch は 404 エラーで解決されるため、このチェックが省略されることがよくあります。

AIアシスタントはエラーコードを読み取り、原因を直接特定することで、ポートの競合、権限の問題、構文エラーなどを区別し、初めてのNodeプロジェクトにおける推測作業を大幅に短縮します。

リクエストオブジェクトはストリームなので、そのデータイベントをバッファに収集し、終了イベントで結果を解析します。Expressなどのフレームワークには、この処理を自動的に実行してくれるボディ解析ミドルウェアが用意されています。