Express 5.0はまだベータ版リリース段階ですが、リリースに含まれる変更と、Express 4アプリをExpress 5に移行する方法のプレビューを以下に示します。
最新のベータ版をインストールしてExpress 5をプレビューするには、アプリケーションのルートディレクトリで次のコマンドを入力します。
$ npm install "express@>=5.0.0-beta.1" --save
その後、自動テストを実行して何が失敗するかを確認し、下記の更新に従って問題を修正できます。テストの失敗に対処した後、アプリを実行して発生するエラーを確認します。アプリがサポートされていないメソッドまたはプロパティを使用しているかどうかすぐにわかります。
削除されたメソッドとプロパティ
変更されたもの
改善点
アプリでこれらのメソッドまたはプロパティのいずれかを使用している場合、クラッシュします。そのため、バージョン5に更新した後、アプリを変更する必要があります。
Express 5は、app.del()
関数をサポートしなくなりました。この関数を使用すると、エラーがスローされます。HTTP DELETEルートの登録には、代わりにapp.delete()
関数を使用してください。
当初、delete
はJavaScriptの予約語であるため、delete
ではなくdel
が使用されていました。しかし、ECMAScript 6以降、delete
およびその他の予約語はプロパティ名として合法的に使用できます。
app.param(fn)
シグネチャは、app.param(name, fn)
関数の動作を変更するために使用されていました。v4.11.0以降非推奨となっており、Express 5では完全にサポートされなくなりました。
次のメソッド名は複数形になりました。Express 4では、古いメソッドを使用すると非推奨警告が表示されました。Express 5では、これらは完全にサポートされなくなりました。
req.acceptsCharset()
はreq.acceptsCharsets()
に置き換えられました。
req.acceptsEncoding()
はreq.acceptsEncodings()
に置き換えられました。
req.acceptsLanguage()
はreq.acceptsLanguages()
に置き換えられました。
app.param(name, fn)
関数における名前の先頭のコロン文字(:)は、Express 3の名残であり、下位互換性のために、Express 4では非推奨通知付きでサポートされていました。Express 5では、これを黙って無視し、コロンをプレフィックスせずにnameパラメーターを使用します。
これは、app.paramのExpress 4のドキュメントに従っている場合、先頭のコロンについて言及していないため、コードに影響を与えることはありません。
フォームデータを取得するこの潜在的に混乱を招きやすく危険なメソッドは削除されました。今度は、req.params
、req.body
、またはreq.query
オブジェクトで送信されたパラメーター名を具体的に検索する必要があります。
Express 5は、res.json(obj, status)
シグネチャをサポートしなくなりました。代わりに、ステータスを設定してから、次のようにres.json()
メソッドにチェーンします: res.status(status).json(obj)
。
Express 5は、res.jsonp(obj, status)
シグネチャをサポートしなくなりました。代わりに、ステータスを設定してから、次のようにres.jsonp()
メソッドにチェーンします: res.status(status).jsonp(obj)
。
Express 5は、res.send(obj, status)
シグネチャをサポートしなくなりました。代わりに、ステータスを設定してから、次のようにres.send()
メソッドにチェーンします: res.status(status).send(obj)
。
Express 5は、status
が数値であるres.send(status)
シグネチャをサポートしなくなりました。代わりに、res.sendStatus(statusCode)
関数を使用します。これは、HTTPレスポンスヘッダーのステータスコードを設定し、コードのテキストバージョン(「Not Found」、「Internal Server Error」など)を送信します。res.send()
関数を使用して数値を送信する必要がある場合は、数値を引用符で囲んで文字列に変換します。これにより、Expressはサポートされていない古いシグネチャの使用として解釈しません。
res.sendfile()
関数は、Express 5ではキャメルケースのバージョンres.sendFile()
に置き換えられました。
パスルートマッチング構文とは、app.all()
、app.use()
、app.METHOD()
、router.all()
、router.METHOD()
、およびrouter.use()
APIの最初の引数として文字列が指定された場合です。着信リクエストへのパス文字列のマッチング方法について、次の変更が行われました。
?
、*
、および+
パラメーター修飾子を付け加えました。(*)
は無効になり、(.*)
として記述する必要があります。req.params
の位置では使用できなくなりました。/:foo(.*)
はreq.params.foo
としてのみキャプチャされ、req.params[0]
としては使用できません。/\\d+
は無効になり、/(\\d+)
として記述する必要があります。*
パスセグメントの動作が削除されました。/foo/*/bar
は、リテラル*
をミドルセグメントとして一致させます。拒否されたpromiseを返すリクエストミドルウェアとハンドラーは、拒否された値をError
としてエラー処理ミドルウェアに転送することで処理されるようになりました。これは、ミドルウェアとハンドラーとしてasync
関数を使用することがこれまで以上に簡単になったことを意味します。async
関数でエラーがスローされた場合、またはasync
関数内で拒否されたpromiseがawait
された場合、それらのエラーはnext(err)
を呼び出した場合と同じように、エラーハンドラーに渡されます。
Expressがエラーを処理する方法の詳細については、エラー処理に関するドキュメントを参照してください。
Express 4で削除されたapp.router
オブジェクトが、Express 5で復活しました。新しいバージョンでは、このオブジェクトは基本的なExpressルーターへの参照にすぎません。Express 3では、アプリで明示的に読み込む必要がありました。
Express 4では、req.host
関数は、ポート番号が存在する場合に誤って削除していました。Express 5では、ポート番号が保持されます。
req.query
プロパティは、書き込み可能なプロパティではなくなり、ゲッターになりました。デフォルトのクエリパーサーは「extended」から「simple」に変更されました。
このメソッドは、同期実装を持ち、推奨されるインターフェースに違反していたビューエンジンによって引き起こされるバグを回避するために、すべてのビューエンジンで非同期動作を強制するようになりました。