Express 5への移行

概要

Express 5.0はまだベータ版リリース段階ですが、リリースに含まれる変更と、Express 4アプリをExpress 5に移行する方法のプレビューを以下に示します。

最新のベータ版をインストールしてExpress 5をプレビューするには、アプリケーションのルートディレクトリで次のコマンドを入力します。

$ npm install "express@>=5.0.0-beta.1" --save

その後、自動テストを実行して何が失敗するかを確認し、下記の更新に従って問題を修正できます。テストの失敗に対処した後、アプリを実行して発生するエラーを確認します。アプリがサポートされていないメソッドまたはプロパティを使用しているかどうかすぐにわかります。

Express 5での変更

削除されたメソッドとプロパティ

変更されたもの

改善点

削除されたメソッドとプロパティ

アプリでこれらのメソッドまたはプロパティのいずれかを使用している場合、クラッシュします。そのため、バージョン5に更新した後、アプリを変更する必要があります。

app.del()

Express 5は、app.del()関数をサポートしなくなりました。この関数を使用すると、エラーがスローされます。HTTP DELETEルートの登録には、代わりにapp.delete()関数を使用してください。

当初、deleteはJavaScriptの予約語であるため、deleteではなくdelが使用されていました。しかし、ECMAScript 6以降、deleteおよびその他の予約語はプロパティ名として合法的に使用できます。

app.param(fn)

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)の名前の先頭のコロン(:)

app.param(name, fn)関数における名前の先頭のコロン文字(:)は、Express 3の名残であり、下位互換性のために、Express 4では非推奨通知付きでサポートされていました。Express 5では、これを黙って無視し、コロンをプレフィックスせずにnameパラメーターを使用します。

これは、app.paramのExpress 4のドキュメントに従っている場合、先頭のコロンについて言及していないため、コードに影響を与えることはありません。

req.param(name)

フォームデータを取得するこの潜在的に混乱を招きやすく危険なメソッドは削除されました。今度は、req.paramsreq.body、またはreq.queryオブジェクトで送信されたパラメーター名を具体的に検索する必要があります。

res.json(obj, status)

Express 5は、res.json(obj, status)シグネチャをサポートしなくなりました。代わりに、ステータスを設定してから、次のようにres.json()メソッドにチェーンします: res.status(status).json(obj)

res.jsonp(obj, status)

Express 5は、res.jsonp(obj, status)シグネチャをサポートしなくなりました。代わりに、ステータスを設定してから、次のようにres.jsonp()メソッドにチェーンします: res.status(status).jsonp(obj)

res.send(body, status)

Express 5は、res.send(obj, status)シグネチャをサポートしなくなりました。代わりに、ステータスを設定してから、次のようにres.send()メソッドにチェーンします: res.status(status).send(obj)

res.send(status)

Express 5は、statusが数値であるres.send(status)シグネチャをサポートしなくなりました。代わりに、res.sendStatus(statusCode)関数を使用します。これは、HTTPレスポンスヘッダーのステータスコードを設定し、コードのテキストバージョン(「Not Found」、「Internal Server Error」など)を送信します。res.send()関数を使用して数値を送信する必要がある場合は、数値を引用符で囲んで文字列に変換します。これにより、Expressはサポートされていない古いシグネチャの使用として解釈しません。

res.sendfile()

res.sendfile()関数は、Express 5ではキャメルケースのバージョンres.sendFile()に置き換えられました。

変更されたもの

パスルートマッチング構文

パスルートマッチング構文とは、app.all()app.use()app.METHOD()router.all()router.METHOD()、およびrouter.use()APIの最初の引数として文字列が指定された場合です。着信リクエストへのパス文字列のマッチング方法について、次の変更が行われました。

ミドルウェアとハンドラーから処理された拒否されたpromise

拒否されたpromiseを返すリクエストミドルウェアとハンドラーは、拒否された値をErrorとしてエラー処理ミドルウェアに転送することで処理されるようになりました。これは、ミドルウェアとハンドラーとしてasync関数を使用することがこれまで以上に簡単になったことを意味します。async関数でエラーがスローされた場合、またはasync関数内で拒否されたpromiseがawaitされた場合、それらのエラーはnext(err)を呼び出した場合と同じように、エラーハンドラーに渡されます。

Expressがエラーを処理する方法の詳細については、エラー処理に関するドキュメントを参照してください。

app.router

Express 4で削除されたapp.routerオブジェクトが、Express 5で復活しました。新しいバージョンでは、このオブジェクトは基本的なExpressルーターへの参照にすぎません。Express 3では、アプリで明示的に読み込む必要がありました。

req.host

Express 4では、req.host関数は、ポート番号が存在する場合に誤って削除していました。Express 5では、ポート番号が保持されます。

req.query

req.queryプロパティは、書き込み可能なプロパティではなくなり、ゲッターになりました。デフォルトのクエリパーサーは「extended」から「simple」に変更されました。

改善点

res.render()

このメソッドは、同期実装を持ち、推奨されるインターフェースに違反していたビューエンジンによって引き起こされるバグを回避するために、すべてのビューエンジンで非同期動作を強制するようになりました。