Node.js の非同期エラー処理
Node.js における async/await と try/catch ブロック
Node.js の async/await は、非同期処理をより同期的なコードスタイルで記述するための構文糖衣です。これにより、従来のコールバックや Promise チェーンに比べて、コードが読みやすくなり、エラー処理も簡潔になります。
try/catch ブロックは、エラーが発生した場合にその処理を適切にハンドリングするための制御フロー構造です。async/await と組み合わせて使用することで、非同期処理中のエラーをキャッチし、適切な処理を行うことができます。
基本的な使い方
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.erro r('Error:', error);
}
}
fetchDa ta();
この例では、fetch
関数を使用して非同期的にデータを取得し、json
メソッドで解析しています。もしこれらの操作中にエラーが発生した場合、catch
ブロック内でエラーを処理することができます。
複数の非同期操作のエラー処理
async function fetchDataAndProcess() {
try {
const data1 = await fetchData1();
const data2 = await fetchData2();
const result = processData(data1, data2);
console.log(result);
} catch (error) {
console.error('Error:', error);
}
}
複数の非同期操作を連鎖して実行する場合も、外側の try/catch
ブロックでエラーをキャッチすることができます。
カスタムエラー処理
``
async function fetchDataWithCustomErrorHandling() {
try {
const response = await fetch('');
if (!response.ok) {
throw new Error(HTTP error ${response.status}
);
}
const data = await response.json();
console.log(data);
} catch (error) {
if (error instanceof CustomError) {
// カスタムエラーの処理
} else {
// 他のエラーの処理
}
}
}
この例では、`fetch` の結果が成功したかどうかを判断し、失敗した場合にカスタムエラーを投げています。`catch` ブロック内でカスタムエラーかどうかをチェックし、適切な処理を行うことができます。
### 最後に
async/await と try/catch ブロックを組み合わせることで、Node.js の非同期処理をより安全かつ読みやすいコードで記述することができます。エラー処理を適切に行い、アプリケーションの信頼性を向上させましょう。
基本的な例
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.erro r('Error:', error);
}
}
fetchDa ta();
- try/catch ブロック
エラーが発生した場合に、catch
ブロック内でエラーを処理します。 - await キーワード
非同期操作の結果が返されるまでコードの実行を一時停止します。 - async 関数
非同期処理を扱う関数であることを示します。
async function fetchDataAndProcess() {
try {
const data1 = await fetchData1();
const data2 = await fetchData2();
const result = processData(data1, data2);
console.log(result);
} catch (error) {
console.error('Error:', error);
}
}
async function fetchDataWithCustomErrorHandling() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error(`HTTP error ${response.status}`);
}
const data = await response.jso n();
console.log(data);
} catch (error) {
if (error instanceof CustomError) {
// カスタムエラーの処理
} else {
// 他のエラーの処理
}
}
}
- カスタムエラーを投げて、
catch
ブロック内で特定のエラーを処理します。
さらに高度なエラー処理
async function fetchDataWithPromiseRejectionHandling() {
try {
const data = await Promise.all([
fetchData1(),
fetchData2(),
]);
console.log(data);
} catch (error) {
console.error('Error:', error);
}
}
Promise.all
を使用して複数の Promise を並列に実行し、いずれかの Promise が拒否された場合にエラーをキャッチします。
コールバック関数
最も基本的な非同期処理の方法は、コールバック関数を使用することです。
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Error:', error);
});
この方法では、非同期操作が完了した後にコールバック関数が呼び出され、結果を処理したりエラーをキャッチしたりすることができます。
Promise
Promise は、非同期操作の結果を表現するためのオブジェクトです。
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Error:', error);
});
Promise を使用すると、非同期操作の成功または失敗をチェーン状に処理することができます。
async/await の組み合わせ
async/await は、Promise をより同期的なコードスタイルで扱うための構文糖衣です。
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
} catch (error) {
console.erro r('Error:', error);
}
}
fetchDa ta();
async/await を使用すると、非同期操作をより直感的に記述することができます。
イベント駆動型プログラミング
Node.js は、イベント駆動型プログラミングモデルを採用しています。
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello, World!');
}).listen(8080);
イベント駆動型プログラミングでは、イベントが発生したときにコールバック関数が呼び出されます。
非同期ライブラリ
Node.js には、非同期処理を簡素化するためのさまざまなライブラリが存在します。
- RxJS
リアクティブプログラミングのためのライブラリです。 - Bluebird
Promise の機能を拡張したライブラリです。 - async
非同期処理をより同期的なコードスタイルで記述するためのライブラリです。
これらのライブラリを使用することで、非同期処理をより効率的に管理することができます。
node.js async-await ecmascript-2017