Express.js 5.0.0 の新機能と更新情報

[![Group24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967621/8661533b-9232-bd5f-4c21-a7fef3e2c5f9.png)](https://leapcell.io/?lc_t=q_jexpress)


## Express.js 5.0.0 リリース：安定性とセキュリティの強化

Express.jsは、Node.jsアプリケーション開発において非常に人気のあるWebアプリケーションフレームワークで、常に開発者の注目を集めてきました。最近、Express.jsチームは公式に5.0.0バージョンをリリースしました。2014年に最初のメジャーバージョンがリリースされてから、丸10年が経過しました。この長い間、Express.jsは多数の反復と最適化を経ており、5.0.0バージョンには新機能と改善点が搭載され、開発者に異なる体験をもたらします。

## I. バージョンリリースの概要
Express.js 5.0.0のリリースは、2つの核心的な目標に焦点を当てています。それは安定性とセキュリティです。このバージョンは、開発者がより堅牢なNode.jsアプリケーションを構築するのを支援し、現代のWeb開発により堅固な基盤を提供することを目的としています。今日の急速に進化する技術環境において、アプリケーションの安定性とセキュリティは直接ユーザーエクスペリエンスとデータセキュリティに関係しています。したがって、Express.jsチームのこの動きは特に重要です。

## II. Node.jsバージョンサポートの変更
Express 5は果敢にも古いバージョンのNode.jsのサポートを中止しました。リリースノートによると、このバージョンはもはやv18以前のNode.jsバージョンをサポートしていません。この変更は単純に見えるかもしれませんが、影響は非常に大きいです。古いバージョンのNode.jsをサポートすることは、ある程度、Express.jsのパフォーマンスと保守性の大幅な改善を制限していました。例えば、古いバージョンのNode.jsにはいくつかのパフォーマンスボトルネックがあり、新しいハードウェア機能や最適化アルゴリズムを完全に活用できず、高コンカレンシーシナリオでのExpressアプリケーションのパフォーマンスが低下します。古いバージョンのサポートを中止することで、継続的な統合（CI）がより安定し、保守が容易になるだけでなく、Express.jsが新しい言語や新しいランタイムの機能をより良く取り入れることができます。同時に、不要な依存関係を排除し、負荷を軽減し、全体的なパフォーマンスを向上させることができます。

## III. セキュリティ関連の改善
### (I) パスルーティングマッチングの変更
包括的なセキュリティ監査の後、Express.jsチームはパスルーティングマッチングの動作方式に重要な変更を加えました。正規表現によるサービス拒否（ReDoS）攻撃に効果的に防御するため、Express 5はもはや正規表現内のサブ表現をサポートしていません。例えば`/:foo (\d+)`などです。Express 4では、`app.get('/:id(\d+)', (req, res) => res.send(`ID: ${req.params.id}`));`のようなコードを使用して特定の形式のパスパラメータをマッチングすることができました。しかし、Express 5ではこのアプローチはもはや許されていません。
Express.JS技術委員会のメンバーであるBlake Embrey氏は、正規表現の例（例えば`/^/flights/([^/]+?)-([^/]+?)/?$/i`）を提供しました。これを`/flights/` + `'-'.repeat (16_000)` + `/x`とマッチングさせると、実際に300ミリ秒かかりましたが、通常は1ミリ秒未満であるはずです。このような大きな時間差は、正規表現が特定の状況で潜在的なパフォーマンスリスクを抱えていることを十分に示しており、これもExpress 5で改善された重要な理由です。アプリケーションのセキュリティを保証するため、Expressチームは開発者に、joiなどの強力な入力検証ライブラリを使用して、入力データを厳密に検証し、悪意のある攻撃を源から防ぐことを推奨しています。

### (II) 正規表現のワイルドカードの要件
Express 5はまた、正規表現内のワイルドカードに明確な要件を課しています。ワイルドカードは明示的に名前を付けるか、(.)**に置き換える必要があります。これにより、ルートマッチングの明確性と予測可能性が向上します。例えば、Express 5では`/foo`のようなパスは`/foo (.)`に更新する必要があります。このように、ルートマッチングを行う際に、開発者はマッチングルールをより明確に理解でき、ルールの不明瞭さに起因する潜在的な問題を回避できます。

### (III) ルート内のオプションパラメータの構文の変更
ルートにおいて、オプションパラメータの構文も大幅に変更されています。Express 4では、`:name?`がオプションパラメータを表すために使用されます。例えば`app.get('/user/:id?', (req, res) => res.send(req.params.id || 'No ID'));`です。Express 5では、構文が`{/:name}`になり、対応するコード例は`app.get('/user{/:id}', (req, res) => res.send(req.params.id || 'No ID'));`です。この構文の変更により、開発者はコードをいくらか調整する必要がありますが、ルートルールがより直感的で理解しやすくなりました。

### (IV) 正規キャプチャグループパラメータへのアクセスの変更
正規キャプチャグループでは、インデックスによる未命名パラメータのアクセスはもはや許されていません。現在、パラメータには名前を付ける必要があります。Express 4では、`app.get('/user(s?)', (req, res) => res.send(req.params[0]));`のようなコードを使用してキャプチャグループ内のパラメータを取得することができ、ここでは`'s'`が返されます。しかし、Express 5では名前付きパラメータが必要で、例えば`app.get('/user:plural?', (req, res) => res.send(req.params.plural));`となります。このアプローチにより、インデックスの混乱に起因するエラーを回避でき、コードの読みやすさと保守性が向上します。

### (V) HTTPステータスコードの妥当性チェック
Express 5はHTTPステータスコードの妥当性チェックを強化しています。これは、サイレントエラーを防ぎ、開発者が困難なデバッグプロセスに陥るのを回避する重要な防御機構です。Express 4では、`res.status(978).send('Invalid status');`のようなコードを使用すると、無効なステータスコード978が設定されても、エラーが報告されずにサイレントに失敗し、開発者にとって問題のトラブルシューティングが大変な困難をもたらします。Express 5では、同じコードは直接エラーを投げ、開発者に問題を即座に発見し修正するよう促し、開発効率とアプリケーションの安定性を大幅に向上させます。

## IV. 非同期ミドルウェアとルートにおけるエラーハンドリングの改善
Express.js 5は、非同期ミドルウェアとルートにおけるエラーハンドリングをより簡潔かつ効率的にしました。非同期ミドルウェアとルートにおけるエラーハンドリングメカニズムが改善され、拒否されたプロミスを自動的にエラーハンドリングミドルウェアに渡すことができます。開発者はもはや手動でtry/catchブロックを使用する必要がありません。Express 4では、非同期リクエストを処理する際、コードは次のようになるかもしれません：
```javascript
app.get('/data', async (req, res, next) => {
    try {
        const result = await fetchData();
        res.send(result);
    } catch (err) {
        next(err);
    }
});
```
一方、Express 5では、コードを次のように簡略化できます：
```javascript
app.get('/data', async (req, res) => {
    const result = await fetchData();
    res.send(result);
});
```
この改善により、コード量が減少するだけでなく、コード構造が明瞭になり、エラーの発生確率も低下します。

## V. アップグレードの推奨事項
Expressチームは破壊的変更を最小限に抑えるために全力を尽くしていますが、Expressコードを新しいバージョンにアップグレードしたい開発者は依然として非常に注意深くなければなりません。アップグレードプロセス中には、上述の構文の変更やNode.jsバージョンの要件など、様々な互換性の問題が発生する可能性があります。したがって、開発者は必ずオンラインの移行ガイドを慎重に見直し、ガイドの手順に従って段階的にアップグレードして、アプリケーションの円滑な移行を保証する必要があります。

OpenJS Foundation（At - Largeカテゴリ）の重要なプロジェクトとして、Express.jsは常にNode.js開発者に強力なサポートを提供してきました。開発者は完全なリリースノートを読んで、より多くの技術的な詳細と例を深く理解し、Express.js 5.0.0の新機能をより良く活用して、より良いNode.jsアプリケーションを構築することができます。Express.js 5.0.0のおかげで、Node.jsアプリケーション開発が新しいレベルに到達することが期待されます。

# [Leapcell: 最適なサーバレスWebホスティングプラットフォーム](https://leapcell.io/?lc_t=q_jexpress)

[![barndpic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967621/3b7be566-d98d-514c-f2a7-14414697e220.png)](https://leapcell.io/?lc_t=q_jexpress)


最後に、Expressアプリを展開するのに最適なプラットフォームを紹介します：[Leapcell](https://leapcell.io/?lc_t=q_jexpress)

## 1. 多言語対応
 - JavaScript、Python、Go、またはRustで開発可能。  

## 2. 無制限のプロジェクトを無料で展開
 - 使用量に応じて課金 — リクエストがなければ料金は発生しません。

## 3. 抜群のコスト効率
 - 使い捨て型の課金方式で、アイドル状態での課金はありません。  
 - 例：25ドルで平均応答時間60msで694万回のリクエストをサポート。  

## 4. ストリームライン化された開発者体験
 - 直感的なUIで簡単にセットアップ可能。  
 - 完全自動化されたCI/CDパイプラインとGitOpsの統合。  
 - 実行可能な洞察のためのリアルタイムメトリックとログ。  

## 5. 簡単なスケーラビリティと高性能
 - 高コンカレンシーを簡単に処理するための自動スケーリング。  
 - オペレーションのオーバーヘッドはゼロ — 構築に集中できます。  

[![Frame3-withpadding2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3967621/8c8dc068-3b7f-7929-6d14-54bf89a55239.png)](https://leapcell.io/?lc_t=q_jexpress)


[ドキュメントでもっと詳しく調べよう！](https://docs.leapcell.io/)

LeapcellのTwitter: [https://x.com/LeapcellHQ](https://x.com/LeapcellHQ)