Node.jsのネイティブWebSocketクライアント
はじめに
Node.js v21から、Undiciライブラリを使用してWebSocket APIが強化され、組み込みのWebSocketクライアントが導入されました。これにより、Node.jsアプリケーションでのリアルタイム通信が簡素化されます。Node.js v22.4.0リリースでは、WebSocket APIが安定版としてマークされ、本番環境での使用準備が整ったことを示しています。
WebSocketとは
WebSocketは、単一のTCP接続上で双方向通信を同時に可能にする標準化された通信プロトコルです。HTTPとは異なり、全二重または双方向の機能を持ちます。WebSocketは、HTTP Upgradeヘッダーを使用してプロトコルを移行することでHTTPとの互換性を実現します。これにより、サーバーはクライアントからの最初の要求なしでコンテンツをプッシュでき、継続的なメッセージ交換のために接続を開いたままにすることができます。これは、HTTPポーリングなどの代替手段よりも少ないオーバーヘッドでリアルタイムのデータ転送に理想的です。WebSocket通信は通常、TCPポート443(セキュア)または80(非セキュア)を介して行われ、Web以外の接続に対するファイアウォールの制限を回避するのに役立ちます。このプロトコルは、非暗号化接続と暗号化接続のために独自のURIスキーム(ws://とwss://)を定義しており、すべての主要なブラウザでサポートされています。
ネイティブWebSocketクライアント
Node.jsは、クライアント接続のためにwsやsocket.ioのような外部ライブラリに頼ることなく、WebSocketのクライアントとして機能できるようになりました。これにより、Node.jsアプリケーションは直接、外部へのWebSocket接続を開始および管理できるようになり、リアルタイムデータフィードへの接続や他のWebSocketサーバーとの対話といったタスクが効率化されます。ユーザーは標準のnew WebSocket()コンストラクタでWebSocketクライアント接続を作成できるようになりました。
上記を基に、基本的なユースケースを示す新しいWebSocketクライアント機能のより実践的な例を追加してみましょう。
基本的な接続とメッセージ処理
// Creates a new WebSocket connection to the specified URL.
const socket = new WebSocket('ws://:8080');
// Executes when the connection is successfully established.
socket.addEventListener('open', event => {
console.log('WebSocket connection established!');
// Sends a message to the WebSocket server.
socket.send('Hello Server!');
});
// Listen for messages and executes when a message is received from the server.
socket.addEventListener('message', event => {
console.log('Message from server: ', event.data);
});
// Executes when the connection is closed, providing the close code and reason.
socket.addEventListener('close', event => {
console.log('WebSocket connection closed:', event.code, event.reason);
});
// Executes if an error occurs during the WebSocket communication.
socket.addEventListener('error', error => {
console.error('WebSocket error:', error);
});
JSONデータの送受信
const socket = new WebSocket('ws://:8080');
socket.addEventListener('open', () => {
const data = { type: 'message', content: 'Hello from Node.js!' };
socket.send(JSON.stringify(data));
});
socket.addEventListener('message', event => {
try {
const receivedData = JSON.parse(event.data);
console.log('Received JSON:', receivedData);
} catch (error) {
console.error('Error parsing JSON:', error);
console.log('Received data was:', event.data);
}
});
上記のjsonコードは、WebSocketアプリケーションで一般的なJSONデータの送受信を示しています。送信前にJavaScriptオブジェクトをJSON文字列に変換するためにJSON.stringify()を使用します。そして、受信した文字列をJSON.parse()でJavaScriptオブジェクトに戻します。最後に、JSON解析のためのエラーハンドリングが含まれています。
これにより、依存関係の管理が軽減され、互換性が向上します。開発者は追加のWebSocketクライアントライブラリをインストールして維持する必要がなくなります。組み込みの実装は最新のWeb標準に準拠しており、より良い相互運用性を保証します。この強化はWebSocket通信のクライアント側に焦点を当てており、Node.jsがWebSocketクライアントとして機能することを可能にします。
理解しておくべき重要なこと
Node.js v22は、組み込みのネイティブWebSocketサーバー実装を提供しません。Webブラウザや他のクライアントからの受信接続を受け入れるWebSocketサーバーを作成するには、依然としてwsやsocket.ioのようなライブラリを使用する必要があります。これは、Node.jsがWebSocketサーバーに簡単に接続できるようになった一方で、WebSocketサーバーになるためには依然として外部ツールが必要であることを意味します。
まとめ
Node.js v22は、アプリケーションがクライアントとしてWebSocketサーバーとシームレスに対話する能力を与えますが、Node.js内でのWebSocketサーバーの作成は、既存のライブラリに依存したままです。この違いは、開発者がNode.jsプロジェクトでリアルタイム通信を実装する際に理解しておくべき重要な点です。