Node.jsは、イベント駆動型のノンブロッキングI/Oモデルによってバックエンド開発を一変させた。堅牢なWebアプリケーション、API、マイクロサービスを構築する上で中心となるのは、HTTPリクエストを効率的かつ確実に行う能力です。外部APIからのデータ取得、サービス間の通信、サードパーティプラットフォームとの統合のいずれにおいても、Node.jsのHTTPリクエストメソッドをマスターすることは不可欠です。.
HTTP通信を簡素化するライブラリは数多く存在しますが、コアとなるツールとそのトレードオフを理解することで、開発者はどのようなシナリオにも適したメソッドを選択できるようになります。この記事では、Node.js の 5 つの強力な HTTP リクエスト・メソッドについて説明します。 http/https モジュールである、, アクシオス、ノードフェッチ、 そして ふくちょく. .それぞれが、パフォーマンス、開発者の経験、機能セットにおいて独自の利点を提供している。.
1.HTTPとHTTPSのネイティブモジュール:コア基盤
Node.jsの中心には、組み込みの http そして https モジュールを使用します。これらは、外部依存なしにHTTPクライアント機能への低レベルアクセスを提供します。冗長ですが、比類のない制御を提供し、パフォーマンスが重要なアプリケーションや最小限の環境に最適です。.
主な利点
- 外部依存なし
- ヘッダー、タイムアウト、ストリーミングの完全制御
- Node.jsストリームとのネイティブな統合
- 最小限のメモリフットプリント
GETリクエストを行う
javascript
const https = require('https');
constオプション = {
ホスト名: 'api.github.com'、
path: '/repos/nodejs/node'、
ヘッダ:{
'User-Agent': 'node-js-app'
}
};
https.get(オプション, (res) => { }.
let data = '';
res.on('data', (chunk) => { データを取得します。
data += chunk;
});
res.on('end', () => { {データ
const repo = JSON.parse(data);
console.log(`Node.js repo has ${repo.stargazers_count} stars``);
});
}).on('error', (err) => {
console.error('Request failed:', err.message);
});JSONペイロードを持つPOSTリクエスト
javascript
const https = require('https');
const postData = JSON.stringify({
title: '新しい投稿'、
body: 'これはコンテンツです、
userId:1
});
const オプション = {
hostname: 'jsonplaceholder.typicode.com'、
path: '/posts'、
method: 'POST'、
ヘッダ:{
'Content-Type': 'application/json'、
'Content-Length':Buffer.byteLength(postData)
}
};
コンストラスト req = https.request(options, (res) => { }.
let response = '';
res.on('data', (chunk) => { レスポンス += チャンク; { レスポンス += チャンク; { レスポンス += チャンク
response += chunk;
});
res.on('end', () => { {レスポンス:', JSON.parse(response); }; }.
console.log('Response:', JSON.parse(response));
});
});
req.on('エラー', (err) => {
console.error('Error:', err.message);
});
req.write(postData);
req.end();;ネイティブ・モジュールは、ストリーミング・シナリオで威力を発揮します。大きなファイルのアップロードやダウンロードの場合、ストリームを直接パイプで送ることができます:
ジャバスクリプト
const fs = require('fs');
const https = require('https');
const fileStream = fs.createReadStream('large-file.zip');
const req = https.request({
hostname: 'example.com'、
path: '/upload'、
method: 'POST'、
ヘッダ:{
'Content-Type': 'application/octet-stream'
}
});
fileStream.pipe(req);;強力ではあるが、ネイティブ・モジュールは、リダイレクト、タイムアウト、JSONパースなどのエッジケースを手動で処理する必要がある。そのため、ラピッドプロトタイピングには向いていませんが、1バイトや1ミリ秒を大切にする場合には最適です。.
2.アクシオス約束に基づく大国
Axiosは、Node.jsやブラウザ環境におけるHTTPリクエストのデファクトスタンダードとなっている。プロミス・ベースの API、自動 JSON 解析、豊富な機能セットにより、開発者に非常に優しい。.
開発者がアクシオスを愛する理由
- JSONリクエスト/レスポンスの自動変換
- 内蔵XSRFプロテクション
- リクエストとレスポンスのインターセプター
- タイムアウトの設定
- CancelToken によるキャンセル可能なリクエスト
インストールと基本的な使い方
バッシュ
npm axiosをインストールする
ジャバスクリプト
const axios = require('axios');
// GETリクエスト
axios.get('https://api.github.com/repos/nodejs/node')
.then(レスポンス => {
console.log(`Stars: ${response.data.stargazers_count}`);
})
.catch(エラー => {
console.error('エラー:', error.メッセージ);
});
// コンフィグを含むPOST
axios.post(
'https://jsonplaceholder.typicode.com/posts'、
{
title: '新しい投稿'、
body: '内容はこちら'、
userId:1
},
{
ヘッダー:{
'Authorization': 'Bearer token123'、
'Custom-Header': 'value'
},
timeout:5000
}
).then(res => {
console.log('Created:', res.data);
});高度な機能インターセプター
インターセプターはリクエストやレスポンスをグローバルに変更できる:
ジャバスクリプト
// リクエストインターセプター
axios.interceptors.request.use(設定 => {)
config.headers['X-Request-ID'] = generateId();
config.metadata = { startTime: new Date() };
config を返します;
});
// レスポンスインターセプター
axios.interceptors.response.use(
レスポンス => {
const endTime = new Date();
const duration = endTime - response.config.metadata.startTime;
console.log(`Request took ${duration}ms`);
return response;
},
エラー => {
console.error('API Error:', error.response?.status);
return Promise.reject(error);
}
);リクエストのキャンセル
ジャバスクリプト
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/data', {)
CancelToken: source.token
}).catch(thrown => {
if (axios.isCancel(thrown)) { { {.
console.log('Requestcanceled');
}
});
// リクエストをキャンセルする
source.cancel('Operation canceled by user');;Axiosは、一貫したエラー処理、ロギング、リクエスト修正が重要なエンタープライズアプリケーションで優れています。また、ブラウザとの互換性があるため、同型のアプリケーションにも最適です。.
3. node-fetch:Node.jsにFetch APIをもたらす
最近のブラウザにネイティブなFetch APIは、HTTPリクエストにクリーンでプロミスベースのインターフェイスを提供します。. ノードフェッチ このおなじみのAPIをNode.jsに導入することで、フロントエンドからバックエンドに移行する開発者に最適です。.
主な特長
- 使い慣れたブラウザのようなAPI
- 軽量 (~4KB)
- ストリームのサポート
- WHATWG Fetch仕様準拠
インストール
バッシュ npm node-fetch をインストールする
基本的な使い方(CommonJS)
javascript
const fetch = require('node-fetch');
// GETリクエスト
fetch('https://api.github.com/repos/nodejs/node')
.then(res => res.json())
.then(データ => {
console.log(`Stars: ${data.stargazers_count}`);
})
.catch(err => {
console.error('Fetch failed:', err);
});
// JSONでPOSTする
fetch('https://jsonplaceholder.typicode.com/posts', {
メソッド: 'POST'、
ボディJSON.stringify({
title: 'fetch post'、
body: 'using node-fetch'、
userId:1
}),
ヘッダー:{
'Content-Type': 'application/json'
}
})
.then(res => res.json())
.then(data => console.log(データ));;ストリーミング対応
ジャバスクリプト
フェッチ('https://example.com/large-file.zip')
.then(res => {
const dest = fs.createWriteStream('downloaded.zip');
res.body.pipe(dest);
});キャンセル用AbortController
javascript
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 5000);
fetch('https://slow-api.com/data', {
signal: controller.signal
})
.then(res => res.json())
.catch(err => {
if (err.name === 'AbortError') { { { (err.name === 'AbortError')
console.log('Request timed out');
}
});ノードフェッチ は、最新のFetch API構文を好み、最小限の抽象化を望む開発者に最適です。バージョン3+は、ESMをネイティブにサポートし、最新のNode.jsアプリケーションのための将来を保証します。.
4.ゴット人間にやさしいHTTPクライアント
Gotは、Node.jsのために特別に設計された、機能豊富で人に優しいHTTPリクエスト・ライブラリです。ネイティブの Fetch API を、賢明なデフォルトと強力な拡張機能で拡張しています。.
際立った特徴
- 人間が読めるエラーメッセージ
- 指数バックオフによる自動再試行
- ページネーションのリクエスト
- キャッシュ・サポート
- 進捗報告
- リクエスト・ライフサイクルのフック
インストール
バッシュ npm install got
基本的な使い方
javascript
const got = require('got');
// 単純なGET
got('https://api.github.com/repos/nodejs/node').json()
.then(データ) => {
console.log(`Stars: ${data.stargazers_count}`);
});
// POSTでリトライ
got.post('https://jsonplaceholder.typicode.com/posts', {
json: {
title: 'got request'、
body: 'content'、
userId:1
},
retry:{
limit: 3、
methods: ['POST']、
statusCodes:[413, 429]
}
}).json().then(console.log);;進歩するストリーミング
javascript
const stream = got.stream('https://example.com/large-file.zip');
stream.on('downloadProgress',プログレス => {)
console.log(`Downloaded ${progress.transferred} bytes`);
});
const writeStream = fs.createWriteStream('file.zip');
stream.pipe(writeStream);;カスタマイズのためのフック
ジャバスクリプト
const client = got.extend({
フック:{
beforeRequest: [
オプション => {
options.headers['x-request-id'] = generateId();
}
],
afterResponse:[
response => {
response.requestDuration = Date.now() - response.requestStart;
レスポンスを返す;
}
]
}
});Gotは、信頼性、可観測性、開発者のエクスペリエンスが重要な本番環境で輝きます。その思慮深いデフォルトは、柔軟性を維持しながら定型文を減らします。.
5.ウンディチ:高性能コンテンダー
Undici(イタリア語で「11」の意)は、Node.jsのコアチームによってNode.jsのために構築されたモダンなHTTP/1.1クライアントです。パフォーマンス、正しさ、標準準拠に重点を置いています。.
パフォーマンスの利点
- JavaScriptで書かれ、パフォーマンスが重要な部分はC++で書かれている。
- コネクション・プーリング
- HTTP/1.1パイプライン化
- 全二重ストリーム
- ネイティブ・モジュールと比較してオーバーヘッドがゼロ
インストール
バッシュ npm install undici
基本的な使い方
ジャバスクリプト
const { request }.= require('undici');
非同期関数 makeRequest() {
const { statusCode, body } = await request('https://api.github.com/repos/nodejs/node');
console.log('Status:', statusCode);
for await (body の const データ) { { { statusCode のデータを取得します。
console.log('Data chunk:', data.toString());
}
}
makeRequest();;接続プーリングでクライアントを使用する
ジャバスクリプト
const { クライアント }.= require('undici');
const client = new Client('https://api.github.com');
非同期関数 concurrentRequests() {
const promises = Array(10).fill().map() => クライアントがリクエストしたプロミスのうち、次のプロミスを指定する。
client.request({
path: '/repos/nodejs/node'、
method: 'GET'
}).then(({ body }) => body.json())
);
const results = await Promise.all(promises);
console.log('同時リクエスト完了');
}
concurrentRequests();;ストリーミング・アップロード
ジャバスクリプト
const { パイプライン }; = require('stream')= require('stream');
const fs = require('fs');
const client = new Client('https://httpbin.org');
パイプライン(
fs.createReadStream('data.json')、
client.stream({
path: '/post'、
メソッド: 'POST'、
ヘッダー:{content-type': 'application/json' }.
}, ({ statusCode }) => {
console.log('Response status:', statusCode);
}),
(err) => {
if (err) console.error('Pipeline failed:', err);
);Undici は Node.js における HTTP クライアントの未来を象徴している。モダンなAPIを提供しながら、ネイティブ・モジュールに匹敵するパフォーマンスを発揮します。特に高スループットのアプリケーションやマイクロサービスに適している。.
それぞれの比較と使用時期
| 方法 | 最適 | パフォーマンス | 学習曲線 | 特徴 |
|---|---|---|---|---|
ネイティブ http/https | 最大限のコントロール、最小限の減価償却費 | 素晴らしい | 険しい | ベーシック |
| アクシオス | エンタープライズアプリ、一貫性 | グッド | 優しい | リッチ |
| ノードフェッチ | 使い慣れたAPI、軽量 | グッド | とても優しい | 中程度 |
| ゲット | 生産の信頼性 | 非常に良い | 優しい | 非常にリッチ |
| 優しい | 高性能、モダンなノード | 素晴らしい | 中程度 | 成長 |
パフォーマンスベンチマーク(リクエスト/秒)
アンディチ:18,500 ネイティブ: 16,200 ゴット 12,800 ノードフェッチ 11,500 アクシオス 9,800
すべての方法におけるベストプラクティス
- 常にエラーを処理する - ネットワーク障害は避けられない
- タイムアウトの設定 - ハング・リクエストの防止
- 回答の検証 - ステータスコードと内容のチェック
- コネクション・プーリングを使用する 同一ホストへの複数リクエストの場合
- リトライ・ロジックの実装 過渡故障用
- リクエスト・メトリクスの監視 生産中
- レート制限の尊重 外部APIの
javascript
// Generic error handling pattern
async function safeRequest(requestFn) {
try {
const response = await requestFn();
if (response.status >= 400) {
throw new Error(`HTTP ${response.status}`);
}
return response.data;
} catch (error) {
if (error.code === 'ENOTFOUND') {
// DNS failure
} else if (error.code === 'ECONNRESET') {
// Connection reset
}
throw error;
}
}結論
Node.jsのHTTPリクエスト・メソッドをマスターすることは、堅牢なアプリケーションを構築するための基本です。それぞれのメソッドは異なるニーズに対応します:
- 用途 ネイティブモジュール 絶対制御とゼロ依存が必要な場合
- 選ぶ アクシオス にとって エンタープライズ・アプリケーション 豊富な機能と一貫性が必要
- ピック ノードフェッチ 使い慣れたブラウザの Fetch API を使いたい場合
- 選択 ゲット 信頼性と可観測性を必要とする生産システム向け
- 採用 無指定 最新のNode.jsアプリケーションのパフォーマンスを最大化する
最高のNode.js開発者は、1つのメソッドだけを知っているわけではありません。あなたのプロジェクトの当面のニーズに合ったものから始め、時間をかけて専門知識を広げていきましょう。将来の自分(と本番システム)はあなたに感謝するでしょう。.
で カーマテック, 経験豊富な Node.js開発者 Node.jsの最新アップデート(UndiciやネイティブHTTP/2、HTTP/3のサポートなど)をマスターすることで、常に時代の最先端を行くことができます。. Node.js開発者を雇う Carmatecから、効率的でスケーラブルな、最新のWeb開発のベストプラクティスを活用した将来性のあるアプリケーションを構築することができます。.