ホームページ >ウェブフロントエンド >jsチュートリアル >ExpressからFustifyにアプリを移行する方法
Expressは、かつてnode.jsを使用してWebアプリケーションを開発するための最も人気のあるフレームワークでした。しかし、このフレームワークは近年積極的な開発を減少させており、現代のJavaScript機能をサポートしていません。同時に、node.jsアプリケーションの開発にさまざまなアプローチを採用する多くの新しいフレームワークが出現し、Fustifyもその1つです。
この記事では、Fastifyがnode.js Webアプリケーション開発の説得力のある代替手段になった理由を調査します。既存のエクスプレスアプリケーションの書き換えをゼロから避け、代わりに段階的に締め切るように移動する方法を学びます。この記事を勉強した後、既存のエクスプレスアプリケーションを自信を持って移行し、Fastifyフレームワークを利用し始めることができます。
この記事を読むときに、次の条件を満たす必要があります:
キーポイント
fastify-express
<code> app.get("/user/:id", async (request) => await getUser(request.params.id)); </code>
<code> app.get("/user/:id", async (request, reply) => { const name = request.body.name; reply.send({ user: { name } }); }); </code>
統合テストテスト単位テストとは異なる方法で、アプリケーションのコンポーネントをテストします。ユニットテスト個々のコンポーネントの機能。統合テストを使用すると、複数のコンポーネントが連携する動作を検証できます。
ExpressアプリケーションのAPI統合テストを記述した場合、アプリケーションを移行してファースト化した後、同じテストを実行できるようにしたいと考えています。 APIの統合テストを作成する場合、次のポイントを考慮する必要があります。
特定のフレームワークに拘束されるべきではありません。使用しているテストやライブラリを変更せずに、移行の前後に同じテストを実行できるようにしたいと考えています。
Fustify-Expressプラグインは、完全に補償され、ファースト化を追加します。これは、Express MiddlewareとRoutesをファーストサーバーに追加するために使用できる使用()メソッドを提供します。これにより、既存のエクスプレスアプリケーションの一部を徐々に移行してファスト化するオプションが得られます。
これは、エクスプレスルーターの例です:
<code> app.get("/user/:id", async (request) => await getUser(request.params.id)); </code>
Fustify-Expressを使用して、既存のExpressルーターをFastify Serverインスタンスに追加できます。
<code> app.get("/user/:id", async (request, reply) => { const name = request.body.name; reply.send({ user: { name } }); }); </code>しばらくして、アプリケーションの移行を開始するために、これらすべての機能の詳細を検討します。
Fustify-Expressプラグインを使用することは長期的なソリューションではないことに注意することが重要です。 Fustifyの完全な利点を取得したい場合は、最終的にはExpress固有のアプリケーションコードを移行する必要があります。ただし、Fastify-Expressプラグインは、段階で断食するために移行する機会を提供します。
例の例
依存関係が必要です
<code>// src/routes.js const router = express.Router(); router.get("/:user_id", function getUser(request, response, next) { response.json({}); }); export default router; </code>次に、このコマンドを端末に実行して、Expressアプリケーションで必要な依存関係をインストールします。
最後に、パッケージを開き、スクリプトの上に次の行を追加します。
<code>// src/server.js import Fastify from "fastify"; import ExpressPlugin from "fastify-express"; import routes from "./routes.js"; const fastify = Fastify(); await fastify.register(ExpressPlugin); fastify.use("/user", routes); await fastify.listen(3000); </code>これにより、アプリケーションにESモジュールをロードできます。
ルーティングモジュール
<code>mkdir express-to-fastify-migration cd express-to-fastify-migration npm init -y </code>
ルーティングとミドルウェアのカプセルをカプセル化するのに役立つExpressルーターインスタンスを作成します。 Expressのルーターを使用して、アプリケーションを離散モジュールに整理するのに役立ちます。たとえば、 /ユーザールーティング用のルーターと、 /アドレスルーティング用のルーターがある場合があります。これにより、エクスプレスアプリケーションを段階的に段階的に段階的に段階的に段階的にするのに役立つ方法がわかります。
上記のコードでは、2つのエクスプレスミドルウェアの例を構成しました。
Express.json()。このミドルウェア関数はExpressに組み込まれています。 JSONリクエスト本体の解析を処理します。
<code>npm install express cors </code>cors。このミドルウェアは、CORSヘッダーをAPI応答に追加するのに役立ちます。これにより、APIをWebページから呼び出すことができます。
ここで、ユーザーを取得するためのルートを追加します:
<code> app.get("/user/:id", async (request) => await getUser(request.params.id)); </code>
投稿ルーティングと同様に、上記のルーティングハンドラーは通常、データベースを呼び出してユーザーデータを取得しますが、この例では、応答本体に送信するオブジェクトを強調表示しています。
最後に、ルーターオブジェクトを別のモジュールにインポートできるように、ルーターオブジェクトをエクスポートします。
<code> app.get("/user/:id", async (request, reply) => { const name = request.body.name; reply.send({ user: { name } }); }); </code>APPモジュール
このモジュールでは、新しいExpress Serverインスタンスを作成する関数を定義します。次に、サーバーインスタンスにルーターオブジェクトを追加します。
<code>// src/routes.js const router = express.Router(); router.get("/:user_id", function getUser(request, response, next) { response.json({}); }); export default router; </code>
サーバーモジュール
アプリケーションを実行します
<code>// src/server.js import Fastify from "fastify"; import ExpressPlugin from "fastify-express"; import routes from "./routes.js"; const fastify = Fastify(); await fastify.register(ExpressPlugin); fastify.use("/user", routes); await fastify.listen(3000); </code>
別の端末では、Curlを使用してAPIにリクエストを行い、機能しているかどうかを確認できます。
<code>mkdir express-to-fastify-migration cd express-to-fastify-migration npm init -y </code>次のように応答を受信する必要があります
アプリケーションをExpressから締め切りに移行します
<code>npm install express cors </code>
これで、Fustifyフレームワークの使用に移行する完全に機能するExpressアプリケーションがあります。
<code>"type": "module", </code>依存関係が必要です
Fustify Framework
Fastify -Corsプラグイン - これは、私たちのアプリケーションがすでに使用しているExpress Corsミドルウェアの移植版です。
Expressの代わりにFastifyとfustify-Expressをインポートします
<code>// src/routes.js import express from "express"; import cors from "cors"; const router = express.Router(); router.use(express.json()); router.use(cors({ origin: true })); </code>Express Serverインスタンスの代わりにFastify Serverインスタンスを作成する
fustify-expressプラグインを使用して、エクスプレスルーターオブジェクトをサーバーに追加します
これは、これらの変更を行った後の私たちがどのように見えるかです:
GitHubでこれらのコードの変更の違いを表示できます。
<code>// src/routes.js router.post("/", function createUser(request, response, next) { const newUser = request.body; if (!newUser) { return next(new Error("Error creating user")); } response.status(201).json(newUser); }); </code>
Fastifyはネイティブに約束をサポートしているため、上記のコードでは、待ち望みを使用してから、Fustifyの組み込みロギング機能を使用してエラーをキャプチャしてログに記録できます。
当社のアプリケーションは、ファーストを使用してリクエストをルーティングし、応答を送信するようになりました。フル機能がありますが、ルーティングはまだExpressを使用しています。表現するために完全に移行するためには、ルートをファストフィーの使用に移行する必要があります。
ルーティングモジュール(src/routes.js)をリファクタリングするために、いくつかの速度固有の行を削除することから始めます:
<code> app.get("/user/:id", async (request) => await getUser(request.params.id)); </code>デフォルトモジュールのエクスポートを、Fastify Serverインスタンスを受け入れる非同期関数に変更する必要があります。これは、Fastifyプラグインの基盤です。ルーティングモジュールの残りのコードは、このプラグイン機能に移動されます:
<code> app.get("/user/:id", async (request, reply) => { const name = request.body.name; reply.send({ user: { name } }); }); </code>ミドルウェアとルーティングがFastifyを使用するためには、変更する必要があります。
ルーターの参照を変更して、ファーシフィー
GitHubでこれらのコードの変更の違いを表示できます。
<code>// src/routes.js const router = express.Router(); router.get("/:user_id", function getUser(request, response, next) { response.json({}); }); export default router; </code>
例のExpressアプリケーションには1つのルーターのみがあるため、アプリケーションのすべてのルートを一度にFustifyを使用するように移行できます。ただし、複数のルーターを備えたより大きなエクスプレスアプリケーションがある場合、各ルーターを移行して、一度に段階的に段階的に固定することができます。
<code>// src/server.js import Fastify from "fastify"; import ExpressPlugin from "fastify-express"; import routes from "./routes.js"; const fastify = Fastify(); await fastify.register(ExpressPlugin); fastify.use("/user", routes); await fastify.listen(3000); </code>ミドルウェアをプラグイン
に置き換えます
アプリケーションは良好な状態であり、Expressからほぼ完全に移行して断食しました。もう1つ移行すること:CORS Express Middlewareパッケージの使用。 Fastify-Corsプラグインを以前にインストールしましたが、CORSミドルウェアを交換するためにアプリケーションに追加する必要があります。ルーティングモジュール(src/routes.js)では、CORSミドルウェアのインポートを置き換える必要があります。
プラグインをFustifyに登録するとき、プラグイン機能とオプションオブジェクトを個別のパラメーターとして渡す必要があることに注意してください。
Fustify-Expressプラグインによって提供される使用()関数を使用しなくなったため、アプリケーションから完全に削除できます。これを行うには、アプリモジュール(src/app.js)から次の行を削除しましょう。
<code> app.get("/user/:id", async (request) => await getUser(request.params.id)); </code>
GitHubでこれらのコードの変更の違いを表示できます。
ExpressからFustifyへのアプリケーションの移行が完了しました!端末でこのコマンドを実行することにより、Express関連の依存関係を削除できます。
<code> app.get("/user/:id", async (request, reply) => { const name = request.body.name; reply.send({ user: { name } }); }); </code>GitHubでこれらのコードの変更の違いを表示できます。
移行アプリケーションを実行します
最初に、端末でアプリケーションを実行します:
<code>// src/routes.js const router = express.Router(); router.get("/:user_id", function getUser(request, response, next) { response.json({}); }); export default router; </code>次に、別の端末で、Curlを使用してAPIにリクエストを行い、予想どおりに機能することを確認します。
次のように応答を受信する必要があります
<code>// src/server.js import Fastify from "fastify"; import ExpressPlugin from "fastify-express"; import routes from "./routes.js"; const fastify = Fastify(); await fastify.register(ExpressPlugin); fastify.use("/user", routes); await fastify.listen(3000); </code>
ミドルウェアを取り除きます
<code>mkdir express-to-fastify-migration cd express-to-fastify-migration npm init -y </code>Expressアプリケーションでは、いくつかのミドルウェア関数のみを使用していますが、実際のExpressアプリケーションではさらに使用する場合があります。ご覧のとおり、Fastify-Expressプラグインを使用すると、Express Middleware(必要に応じて)の使用を続けることができます。これにより、独自のカスタムエクスプレスミドルウェアの書き換えを遅らせてプラグインを固定することができます。しかし、サードパーティのエクスプレスミドルウェアをどのように置き換えるのでしょうか?
cors
ヘルメットfustify-helmet
エクスプレスアプリケーションを移行することにより、ファストフィーに精通し始めたので、今度は恩恵を受けることができる他のファースト機能を検討し始める時が来ました。
検証
これは、JSONモードを使用して、ポストルートでリクエスト本文を確認する例です。
詳細については、Fustifyの検証およびシリアル化ドキュメントをご覧ください。
log record
Node.jsアプリケーションでのログログのログは、生産環境でのパフォーマンスに悪影響を与える可能性があります。これは、ログデータを他の場所(たとえば、ElasticSearch)にシリアル化と転送に多くのステップが含まれるためです。このアプリケーションでの高い最適化は非常に重要です。<code>npm install express cors </code>
ログロギングはFustifyに完全に統合されているため、ロガーの選択と統合に時間を費やす必要はありません。 Fastifyは、高速で柔軟なロガーであるPinoを使用します。 JSON形式でログを生成します:
<code> app.get("/user/:id", async (request) => await getUser(request.params.id)); </code>
Fustify Serverインスタンスを作成すると、ロギングを有効にしてPinoに渡されたオプションをカスタマイズできます。上記のように、Fustifyはログメッセージを自動的に出力します。 Loggerインスタンスは、Fastify Serverインスタンス(たとえば、fustify.log.info( "..."))とすべてのリクエストオブジェクト(たとえば、request.log.info( "..."))で使用できます。
詳細については、Fastifyロギングドキュメントをご覧ください。
FASTIFYは、エラー処理機能を明示的に指定できるSetErrorHandler()メソッドを提供します。これはExpressとは異なります。ミドルウェアのエラーは、受け入れるパラメーター(err、req、res、next)によってのみ区別でき、特定の順序で追加する必要があります。
完全な柔軟性については、さまざまなプラグインで異なるファーストエラーハンドラーを指定できます。詳細については、Fastifyエラーのドキュメントをご覧ください。
デコレーターは、ファーシフィーサーバーインスタンスなど、コアファーストオブジェクトをリクエストと返信オブジェクトにカスタマイズできるようにするための強力な機能の強力な機能です。以下は、基本的なデコレーターの例です
<code> app.get("/user/:id", async (request, reply) => { const name = request.body.name; reply.send({ user: { name } }); }); </code>デコレーターを使用すると、データベース接続などのコンテンツを使用したり、ファストフィーアプリケーション全体でエンジンを表示したりできます。詳細については、Fastify Decoratorのドキュメントをご覧ください。
結論
以下は、Expressから1として移行するときに役立つと思われるいくつかのリソースです。
私の明示的なアプリケーションを移行してファースト化するにはどうすればよいですか?
fustifyでエクスプレスミドルウェアを使用できますか?
ファーストのエラーを処理する方法は?
Fustifyでフックを使用する方法は?
プラグインは、アプリケーションの機能を拡張できるFustifyの重要な機能です。プラグインを使用して、新しい機能を追加したり、他のサービスと統合したり、アプリケーションロジックをカプセル化できます。 Fastifyにはリッチなプラグインエコシステムがあり、独自のプラグインも作成できます。
Fastifyには、パラメーター、クエリ文字列、ワイルドカードなどをサポートする強力なルーティングシステムがあります。ルートのメソッド、URL、ハンドラー、その他のオプションを指定するオプションオブジェクトを受け入れる「ルート」メソッドを使用してルートを定義できます。
FASTIFYでは、ルーティングハンドラーに渡された「返信」オブジェクトを使用して応答を送信できます。 「送信」、「コード」、「ヘッダー」、「タイプ」など、「返信」オブジェクトに応答を送信する方法はいくつかあります。また、ファーストはパフォーマンスのためにJSON応答を自動的にシリアル化します。
FASTIFYは、JSONスキーマを使用したリクエストと応答の確認をサポートします。ルートのパターンを定義できます。ファストフィーは、これらのパターンに基づいて、着信要求と発信応答を自動的に検証します。これにより、エラーを早期に検出し、アプリケーションの信頼性を向上させるのに役立ちます。
Fastifyは、高速で効率的になるように設計されています。軽量アーキテクチャを使用し、HTTP/2とHTTP/3をサポートし、オーバーヘッドを最小限に抑える強力なプラグインシステムを備えています。また、FustifyはJSON応答を自動的にシリアル化し、リクエストと応答の検証をサポートします。これにより、パフォーマンスの向上に役立ちます。
以上がExpressからFustifyにアプリを移行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。