7 ポイント 投稿者 GN⁺ 2024-10-20 | 4件のコメント | WhatsAppで共有
  • 10年前に最初の v5 PR が登録され、ついにマージ & 公開された
  • 今後のリリースでより大きな影響を持つ変更を実装するため、意図的にシンプル化されたリリース
  • また、Express が再び動き出していることを Node.js エコシステムに知らせる意味もある

主な変更点

  • Node.js バージョンサポートの変更

    • Node.js 0.10 のサポートを終了し、Node 18 以上のサポートに変更
    • 旧 Node.js バージョンのサポートにより、性能や保守性に重要な変更が遅れていた問題を解消
    • 新しい言語機能とランタイム機能の採用、および不要になった依存関係の削除が可能に
    • 古い Node.js バージョンを利用している企業の難しさを認識し、HeroDevs と提携して v4 サポート終了後も重要なセキュリティパッチを提供する「無期限サポート」を提供予定
  • パス一致と正規表現の変更

    • path-to-regexp ライブラリが 0.x から 8.x に更新され、長年にわたる変更が統合された
    • 正規表現のサブ式(例: /:foo(\\d+))のサポートを終了
      • ReDoS 攻撃を防ぐために削除
      • 移行方法: 堅牢な入力バリデーションライブラリの使用を推奨
    • 一般的なパスパターン向けの簡素化されたパターンを含む
      • :name?{:name} に変更
      • **name に変更
      • (, ), [, ], ?, +, ! が予約文字として追加
    • 順序付き数値パラメータのサポートを終了。すべてのパラメータに名前を付ける必要がある
  • Promise サポート

    • ミドルウェアで発生したエラーにより reject された Promise のサポートを追加
    • resolve された Promise で next を呼び出すことは含まれない
    • 多くの場合、今後は次のようにミドルウェアを書ける:
      app.use(async (req, res, next) => {  
        req.locals.user = await getUser(req);  
        next();  
      });  
      
  • Body parser の変更点

    • CVE-2024-45590 の緩和のため、urlencoded body の深さをユーザーが指定できるオプションを追加(デフォルトは 32)
    • 非推奨の bodyParser() 複合ミドルウェアを削除
    • req.body は常に {} で初期化されなくなった
    • urlencoded パーサーの extended のデフォルト値が false に変更
    • Brotli のロスレスデータ圧縮のサポートを追加
  • 非推奨メソッドシグネチャの削除

    • res.redirect('back')res.location('back'): 'back' というマジック文字列をサポートしなくなった。代わりに req.get('Referrer') || '/' を明示的に使用
    • res.send(status, body) および res.send(body, status) シグネチャ: res.status(status).send(body) を使用
    • res.send(status) シグネチャ: 単純なステータス応答には res.sendStatus(status) を使用し、任意の本文付きステータスコードを送る場合は res.status(status).send() を使用
    • その他の非推奨メソッドシグネチャも削除(詳細は移行ガイドを参照)
  • 移行およびセキュリティガイド

    • v4 から v5 に移行する開発者向けの詳細な移行ガイドを提供
    • Express を安全かつ安心して使用するため、ユーザー入力のバリデーションやセキュリティ慣行などの領域に関する重要な知見を提供する包括的な脅威モデルを提供

GN⁺の見解

  • Express v5 は、Express が再び動き出していることを Node.js エコシステムに知らせることに重点を置いたリリース。旧 Node.js バージョンのサポート終了、セキュリティ問題の解決、保守の簡素化に焦点を当てている
  • このリリースは意図的にシンプルに保たれており、エコシステムの障害を取り除き、今後のリリースでより大きな影響を与える変更を可能にする
  • Express は Node.js 向けの高速で、意見を押し付けず、ミニマルな Web フレームワークという哲学を持つ。これはユーザー入力のバリデーションやセキュリティ慣行といった領域で重要な知見を提供する
  • Express v5 への移行に向けた詳細なガイドと包括的な脅威モデルが提供され、開発者が Express を安全かつ安定して利用できるよう支援する
  • Express プロジェクトの新しい管理者たちは、Express エコシステムを安定的で信頼できるツールへと発展させることを目指している。そのためにコミュニティと協力し、問題解決と改善を進めていく予定

4件のコメント

 
aer0700 2024-10-22

ああ、ついに promise をサポートするんですね。うちはまだ express をかなり使っているので(笑)。これは良い知らせですね

 
vipeen 2024-10-21

ほとんどが NestJS に移ってしまっていて、直接使う機会はあまりないですね。サーブレットを直接使うのとほぼ同じです

 
chotnt741 2024-10-20

ついにPromiseのエラーを処理できるようになりましたが、今さらあえて使う理由はあまりわかりませんね。

 
GN⁺ 2024-10-20
Hacker Newsのコメント
  • Wes とチームに感謝を伝えたい。v5 の PR が開かれてから 10 年になるというのは、二度読みしなければならなかった。このプロジェクトの慣性を変えるには、途方もない努力が必要だったはず。新しい章に祝意を表する

    • 正規表現を使う際、入力のパースで指数時間の挙動を示すことがある。これは re2 のような実際の正規表現エンジンに切り替えることで簡単に回避できる
    • rsc の "Regular Expression Matching Can Be Simple And Fast" という記事を参照できる
  • Express チームにお祝いを述べる。Node.js の Web サーバーフレームワークは他にも多いが、Express は必要なものをすべて提供してくれるので、他へ移らなかった。この状態が続くことを願う

  • Express がまだ latest ではないことに言及する

  • Wes とチームの仕事に感謝する。Express は今でも nodejs で最も好まれる選択肢であり、活発にメンテナンスされているのは良いことだ

  • v5 のリリースになぜ 10 年もかかったのか疑問に思う

  • perl 6 への言及

  • パスの入力の一部としてレスポンスを含めるという発想は 2010 年代のものに見える。最近のものの大半は、リクエストを受け取ってレスポンスを返すルートを持っている。これは HTTP によりよく適合している

  • 「以前のものを営利企業に移管してサポートを提供する」というモデルは見たことがなかった

  • Express が koa、fastify などと比べてどうなのか気になる