Express.jsチームは2014年の最初のメジャー・バージョン・リリースから10年を経てバージョン5.0.0をリリースした。このリリースは、開発者がより堅牢なNode.jsアプリケーションを作成できるよう、安定性とセキュリティにフォーカスしている。
Express 5はNode.jsの古いバージョンのサポートを終了した。リリースノートにはこう記載されている:
このリリースではNode.js v18より前のバージョンのサポートを終了しました。古いNode.jsバージョンのサポートが多くのクリティカルなパフォーマンスと保守性の改善を妨げていたため、これは重要な変更です。この変更により、より安定した保守可能な継続的インテグレーション(CI)が可能になり、新しい言語とランタイム機能の採用や、不要になった依存関係の削除を実現できます。
セキュリティ監査の結果、チームはパスルートマッチングの方法に変更を加えることを決定した。正規表現のサービス運用妨害(ReDoS)攻撃 を避けるため、Express 5では正規表現内のサブエクスプレッション、例えば/:foo(\d+)
をサポートしなくなった。
// Express 4 exampleapp.get('/:id(\d+)', (req, res) => res.send(`ID: ${req.params.id}`));
Express.JS技術委員会のメンバー Blake Embrey氏は、正規表現(例./^/flights/([^/]+?)-([^/]+?)/?$/i
)を'/flights/' + '-'.repeat(16_000) + '/x'
に対してマッチさせると通常1ミリ秒以下で処理されるはずが300ミリ秒かかる場合があるという例を提供している。Expressチームは堅牢な入力検証ライブラリの使用を推奨している。
またExpress 5では明確性と予測可能性のために、正規表現内のワイルドカードを明示的に名前付けするか、(.*)
**に置き換える必要がある。したがって、/foo*
のようなパスは/foo(.*)
に更新されなければならない。
ルートのオプションパラメーターの構文も変更される。以前のExpress 4の:name?
は{/:name}
になる:
// Express 4 exampleapp.get('/user/:id?', (req, res) => res.send(req.params.id || 'No ID'));// Express 5 exampleapp.get('/user{/:id}', (req, res) => res.send(req.params.id || 'No ID'));
正規表現キャプチャ・グループの名前のないパラメータはインデックスでアクセスできなくなった。パラメータには名前を付ける必要がある:
// Express 4 exampleapp.get('/user(s?)', (req, res) => res.send(req.params[0])); // 's'// Express 5 exampleapp.get('/user:plural?', (req, res) => res.send(req.params.plural));
Express 5はさらに、サイレント・フェイルや困難なレスポンスのデバッグ作業の防御策として、有効なHTTPステータス・コードを強制する。
// Express 4 exampleres.status(978).send('Invalid status'); // Silently fails// Express 5 exampleres.status(978).send('Invalid status'); // Throws an error
Express.js 5では非同期ミドルウェアとルートでのエラー処理がより簡単になった。リジェクトされたPromiseを自動的にエラー処理ミドルウェアに渡し、try/catchブロックの必要性をなくすことで、Express 5は非同期ミドルウェアやルートでのエラー処理を改善している。
// Express 4 exampleapp.get('/data', async (req, res, next) => { try { const result = await fetchData(); res.send(result); } catch (err) { next(err); }});// Express 5 exampleapp.get('/data', async (req, res) => { const result = await fetchData(); res.send(result);});
Expressチームは重大な変更を最小限に抑えるよう努めているが、新しいリリースに興味のある開発者はExpressコードを新しいバージョンに移行する必要がある。開発者はオンラインで利用可能な移行ガイド を確認することができる。
Express.jsはOpenJS Foundation(At-Largeカテゴリー)のプロジェクトである。追加の技術的詳細と例については、開発者はリリースノート全文を読むことをお勧めする。