メインコンテンツまでスキップ

8. Error Handling (エラーハンドリング)

8.1 Handling Errors in UTF-8-Encoded Data (UTF-8エンコードデータのエラー処理)

Textフレーム(Opcode 0x1)を受信する場合、ペイロードデータは有効なUTF-8エンコードテキストでなければなりません。

UTF-8の検証

実装は、受信したテキストデータが有効なUTF-8であることを検証しなければなりません (MUST)。

function isValidUTF8(buffer) {
try {
// Node.jsは無効なUTF-8でエラーをスロー
const str = buffer.toString('utf8');
// ラウンドトリップ変換を検証
return Buffer.from(str, 'utf8').equals(buffer);
} catch (e) {
return false;
}
}

ws.on('message', (data, isBinary) => {
if (!isBinary && !isValidUTF8(data)) {
// クローズコード1007 = 無効なフレームペイロードデータ
ws.close(1007, 'Invalid UTF-8 in text frame');
}
});

エラー処理フロー

無効なUTF-8が検出された場合:

  1. メッセージの処理を停止
  2. ステータスコード1007でCloseフレームを送信
  3. 接続をクローズ

その他の一般的なエラー

プロトコル違反

エラータイプクローズコード処理方法
マスクされていないクライアントフレームを受信1002直ちに接続をクローズ
マスクされたサーバーフレームを受信1002直ちに接続をクローズ
無効なOpcode1002直ちに接続をクローズ
フラグメント化された制御フレーム1002直ちに接続をクローズ
125バイトを超える制御フレーム1002直ちに接続をクローズ
無効なUTF-81007Closeフレームを送信後クローズ
メッセージが大きすぎる1009Closeフレームを送信後クローズ

エラーハンドリングのベストプラクティス

ws.on('error', (error) => {
console.error('WebSocketエラー:', error);
// エラーをログに記録
// 監視システムに通知
});

ws.on('close', (code, reason) => {
if (code !== 1000 && code !== 1001) {
console.error(`異常クローズ: ${code} - ${reason}`);
// 再接続ロジックを実装
setTimeout(() => reconnect(), 5000);
}
});

参考リンク