Webアプリケーションでは、API通信が失敗することがあります。その際に適切なエラーメッセージをユーザーに伝えることは、ユーザーフレンドリーな設計において重要です。本記事では、APIエラーの適切な処理方法と、トースト通知を使って分かりやすくエラーをユーザーに知らせる方法を解説します。
エラーハンドリングの基本
APIエラーとは?
APIエラーは、サーバーとの通信に失敗したときや、サーバー側からエラーレスポンスが返ってきたときに発生します。主な原因として次のものがあります:
- ネットワーク接続エラー
- 無効なリクエスト(クライアント側のエラー)
- サーバー側の問題(500系のエラー)
- 認証や権限の不足
エラーハンドリングが重要な理由
- ユーザーの混乱を防ぐ:何が起こったのかを明確に伝えることで、ユーザーが正しく対応できます。
- システムの信頼性を向上:適切なエラー処理により、アプリケーションが安定して動作するようになります。
APIエラー処理の実装方法
1. 基本的なAPIリクエストとエラーハンドリング
まずは、fetch
を使った基本的なAPIリクエストの例を見てみましょう。
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error(`HTTPエラー!ステータス: ${response.status}`);
}
const data = await response.json();
console.log('データを取得しました:', data);
} catch (error) {
console.error('エラーが発生しました:', error);
showToast('データの取得に失敗しました。もう一度お試しください。');
}
}
fetchData();
解説
response.ok
:HTTPステータスコードが成功(200番台)であるかを確認します。throw new Error()
:エラーメッセージを生成し、キャッチブロックに渡します。showToast()
:トースト通知を表示する関数で、後ほど実装します。
トースト通知の実装
トースト通知とは?
トースト通知は、画面の端に一時的に表示されるメッセージです。数秒後に自動で消えるため、ユーザー体験を妨げずに情報を提供できます。
1. HTMLとCSSによるトースト通知の基本
HTML
<div id="toast" class="toast">エラーメッセージ</div>
CSS
.toast {
visibility: hidden;
min-width: 250px;
margin-left: -125px;
background-color: #f44336;
color: white;
text-align: center;
border-radius: 5px;
padding: 16px;
position: fixed;
z-index: 1;
left: 50%;
bottom: 30px;
font-size: 17px;
transition: opacity 0.5s ease, visibility 0.5s ease;
}
.toast.show {
visibility: visible;
opacity: 1;
}
2. トースト通知を表示するJavaScript
function showToast(message) {
const toast = document.getElementById('toast');
toast.textContent = message;
toast.classList.add('show');
// 3秒後にトースト通知を非表示にする
setTimeout(() => {
toast.classList.remove('show');
}, 3000);
}
解説
visibility
とopacity
:アニメーションでトーストを滑らかに表示・非表示にします。setTimeout()
:3秒後に自動でメッセージを非表示にする設定です。
具体的なエラーハンドリングのシナリオ
1. ネットワークエラー時の処理
ネットワークが切断された場合に、ユーザーに適切なメッセージを表示します。
async function fetchWithNetworkCheck() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error(`HTTPエラー!ステータス: ${response.status}`);
}
const data = await response.json();
console.log('データ取得成功:', data);
} catch (error) {
if (error.message === 'Failed to fetch') {
showToast('ネットワークエラーが発生しました。接続を確認してください。');
} else {
showToast('サーバーエラーが発生しました。しばらくしてから再試行してください。');
}
}
}
解説
- ネットワークエラーとサーバーエラーを区別して、それぞれ異なるメッセージを表示します。
2. 入力データが無効な場合の処理
APIに送信する前に、入力データのバリデーションを行い、無効な場合は即座にトースト通知を表示します。
function validateAndSubmit(formData) {
if (!formData.name || formData.name.trim() === '') {
showToast('名前を入力してください。');
return;
}
// API送信処理へ進む
submitData(formData);
}
実践:エラーハンドリング付きのシンプルなフォーム
HTML
<form id="dataForm">
<label for="name">名前:</label>
<input type="text" id="name" name="name">
<button type="submit">送信</button>
</form>
<div id="toast" class="toast">エラーメッセージ</div>
JavaScript
const form = document.getElementById('dataForm');
form.addEventListener('submit', function(event) {
event.preventDefault();
const name = document.getElementById('name').value;
if (!name.trim()) {
showToast('名前を入力してください。');
return;
}
fetch('https://api.example.com/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ name })
})
.then(response => {
if (!response.ok) {
throw new Error('サーバーエラーが発生しました');
}
return response.json();
})
.then(data => {
showToast('データが正常に送信されました!');
})
.catch(error => {
showToast('エラーが発生しました。もう一度お試しください。');
});
});
結論
エラーハンドリングは、アプリケーションの安定性とユーザー体験を向上させるために欠かせません。トースト通知を活用することで、ユーザーにわかりやすくエラーメッセージを伝えることができます。
基本的な実装を理解したら、エラーの種類ごとに異なる通知方法を実装したり、ログ記録を行うなど、さらなる改善に取り組んでみましょう。