ホームページ > ウェブフロントエンド > jsチュートリアル > Fustifyを使用して最初のREST APIを作成する方法

Fustifyを使用して最初のREST APIを作成する方法

尊渡假赌尊渡假赌尊渡假赌
リリース: 2025-02-10 13:00:41
オリジナル
673 人が閲覧しました

Fustifyを使用して最初のREST APIを作成する方法

キーテイクアウト

  • FASTIFYは、エクスプレスやHAPIなどの他のnode.jsフレームワークを上回るレストAPIを構築するための軽量で高速な代替品を提供します。
  • FASTIFY APIのセットアップには、プロジェクトの初期化、FASTIFYのインストール、基本的なサーバーとルートのセットアップの作成などの簡単な手順が含まれます。
  • Fastifyの堅牢なプラグインエコシステムにより、機能の統合と拡張が容易になり、ホイールを再発明することなく開発者エクスペリエンスが向上します。
  • FASTIFYにスキーマ検証を追加することにより、API要求と応答が事前定義された形式に準拠し、信頼性とエラー処理が改善されることを保証します。
  • Fastifyのフックを使用すると、開発者はさまざまなライフサイクルイベントを傍受でき、アプリケーションの流れと動作をより強く制御できます。
  • Fastifyは、バックエンドWeb開発用に設計されたフレームワークです。 HAPIやExpressなど、より重いnode.js APIフレームワークに代わる、より軽量な代替品を提供します。 2020年7月から、Fastifyはフレームワークの3番目のバージョンをリリースしました。 この3番目のバージョンには、リクエストパラメーターとして、受信および発信要求を検証するための改善された検証能力が伴います。さらに、フレームワークの3番目のバージョンは、KOA、Resitfy、Hapi、およびExpressと比較して、最速のnode.jsフレームワークであるというスループットの主張を統合します。詳細については、ベンチマークページをご覧ください
  • Fastifyは、その軽量のデザインにより、多くの人気を博しています。ただし、プラグインエコシステムには多くの注意が払われています。 Fastifyは、すべてがプラグインであるという考えを採用していますが、JavaScriptを使用すると、すべてがオブジェクトです。これにより、プロジェクトの機能をプラグインとしてすばやくカプセル化し、他のプロジェクトがコードを使用できるように配布することができます。
  • このチュートリアルを始めましょう。 Fustifyの次の側面を学びます:

最初のFustify APIをセットアップする方法

APIルートのファーストを定義する方法

リクエストにスキーマ検証を追加する方法

ファーストプラグインをロードして使用する方法

    Fustify Hooksを定義する方法
  • 要件とインストール
  • このチュートリアルに従うには、
  • が必要です
  • 最新のnode.jsバージョン
  • curlや郵便配達員などのリクエストを送信するためのツール

次に、空のnode.jsプロジェクトを作成してください。まだ持っていない場合は、次のコマンドを使用してプロジェクトを設定できます。

最後に、このプロジェクトにこのファースト依存関係を追加したい:

  1. すべて良いですか?次のステップで基本的なAPIセットアップを作成しましょう。
  2. ステップ1:基本的なAPIセットアップ
  3. 最初に、基本的なAPIセットアップを作成しましょう。開始するには、プロジェクトルート内でindex.jsという新しいファイルを作成する必要があります。

次に、基本的なサーバーのセットアップを追加しましょう。以下のコードをコピーしてください:

<span>npm init -y
</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

ここにはいくつかのことが起こっています。最初にFustifyアプリケーションオブジェクトをロードし、ロギングを有効にします。次に、JSON応答で応答するルートルートを宣言します。コードスニペットの最後の部分は、アプリケーションがリクエストを受信するためにポート3000で聞いていることを示しています。

基本的なサーバーのセットアップが機能するかどうかを検証しましょう。まず、index.jsファイルを実行してサーバーを起動する必要があります:

<span>npm i fastify --save
</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

その後、ブラウザでhttp:// localhost:3000に移動します。次の回答を確認する必要があります

<span>touch index.js
</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
成功?ステップ2に行って、さまざまなCRUDルートを定義しましょう。

ステップ2:CRUDルートを定義します

APIは、取得ルートのみで役に立ちません。ブログを処理するためのより多くのルートを定義しましょう。したがって、次のルートを作成しましょう

/API /ブログですべてのブログを入手してください

    /api/blogsで1つのブログを入手してください/:id
  • 投稿 /api /blogs
  • を投稿します
  • ブログを更新/api/blogs/:id
  • に入れます
  • 削除ブログat/api/blogs/:id
  • を削除します
  • 最初にすることは、ブログコントローラーを作成することです。
  • ステップ2.1:ブログコントローラーを作成

コードを清潔に保つには、プロジェクトルートのコントローラーフォルダーを定義しましょう。ここでは、blogs.js。

というファイルを作成します

このファイルには、データベース統合でこのチュートリアルを複雑にしないようにするデモデータが含まれています。したがって、それぞれにIDとタイトルフィールドが含まれるブログオブジェクトを含む配列を使用します。

さらに、このファイルの上記のすべてのルートのさまざまなハンドラーを定義します。ハンドラーは常にREQ(リクエスト)と返信パラメーターを受け入れます。リクエストパラメーターは、リクエストパラメーターにアクセスしたり、ボディデータを要求したりするのに役立ちます。

/controller/blogs.jsファイルに次のコードを追加します:

/api/blogs/:id by req.params.idなどのルートのリクエストパラメーターにアクセスする方法に注意してください。ポストおよびパットルートの場合、Req.Bodyを介してリクエストの本体にアクセスできます。

ステップ2.2では、ルートハンドラーをルートオブジェクトに接続します。

ステップ2.2:ブログルートとカップルブログコントローラーを定義します
<span>// Require the framework and instantiate it
</span><span>const app = require('fastify')({
</span>    <span>logger: true
</span><span>})
</span>
<span>// Declare a route
</span>app<span>.get('/', function (req<span>, reply</span>) {
</span>    reply<span>.send({ hello: 'world' })
</span><span>})
</span>
<span>// Run the server!
</span>app<span>.listen(3000, (err<span>, address</span>) => {
</span>    <span>if (err) {
</span>        app<span>.log.error(err)
</span>        process<span>.exit(1)
</span>    <span>}
</span>    app<span>.log.info(<span>`server listening on <span>${address}</span>`</span>)
</span><span>})
</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

繰り返しますが、コードを清潔に保つには、プロジェクトルートのルートフォルダーを定義しましょう。ここでは、blogs.jsというファイルを作成します。このファイルは、ブログルートのルートオブジェクトを保持しています:

幸いなことに、Fustifyを使用すると、ルートオブジェクトを含む配列を定義できます。ここでは、以前に定義したハンドラーをさまざまなルートに組み合わせることができます。ブログコントローラーを要求することを忘れないでください。見てみましょう:

ここで、すべてのルートを定義しました。ただし、Fustifyはこれらのルートについては知りません。次のステップでは、ファーシフィーアプリケーションオブジェクトにルートを登録する方法を示しています。

ステップ2.3:ファーストルートを登録
<span>node index.js
</span>
ログイン後にコピー
ログイン後にコピー
このステップでは、アプリオブジェクトにファーストルートを登録します。まず、すべてのブログルートをロードします。次に、すべてのルートをループして、1つずつ登録します。
<span>npm init -y
</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

完了しましたか?ブログが機能するかどうかを検証する時が来ました。ノードインデックスを使用してサーバーをスピンアップし、http:// localhost:3000/blogs/1にアクセスして、デモデータから最初のブログを取得します。次の結果を確認する必要があります

<span>npm i fastify --save
</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
すべて良いですか?ステップ3で、リクエストと応答にスキーマ検証を追加する方法を学びましょう。

ステップ3:スキーマ検証の追加

このステップでは、プロジェクトにスキーマ検証を追加する方法を教えてくれます。ルート定義のスキーマキーを使用して、検証スキーマを特定のルートに渡すことができます。

ルート/API/ブログ/:IDのスキーマを定義して、リクエストパラメーターと応答を検証しましょう。要件?

:IDパラメーターは型文字列

である必要があります
    応答には、2つのプロパティID(整数)とタイトル(文字列)を持つオブジェクトが含まれている必要があります
  1. 次の検証オブジェクトをルート/blogs.jsファイルに追加します:

検証オブジェクトをルートに接続するには、スキーマキーを定義する必要があります。 /api/blogs/:ルート配列のIDルートを探して、それに応じてオブジェクトを変更します。

<span>touch index.js
</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ブログ投稿 /API /ブログを追加するために同じことをしましょう。ここでは、Req.Bodyオブジェクトにタイトルパラメーターが含まれているかどうかを確認します。見てみましょう:

<span>// Require the framework and instantiate it
</span><span>const app = require('fastify')({
</span>    <span>logger: true
</span><span>})
</span>
<span>// Declare a route
</span>app<span>.get('/', function (req<span>, reply</span>) {
</span>    reply<span>.send({ hello: 'world' })
</span><span>})
</span>
<span>// Run the server!
</span>app<span>.listen(3000, (err<span>, address</span>) => {
</span>    <span>if (err) {
</span>        app<span>.log.error(err)
</span>        process<span>.exit(1)
</span>    <span>}
</span>    app<span>.log.info(<span>`server listening on <span>${address}</span>`</span>)
</span><span>})
</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
次に、検証オブジェクトを正しいルートにもう一度接続する必要があります:

<span>node index.js
</span>
ログイン後にコピー
ログイン後にコピー
検証を確認するには、ID 3でブログを取得しましょう。http:// localhost:3000/api/blogs/3でブラウザを開きます。次の回答を確認する必要があります

さあ、間違いを犯して、IDフィールドのパラメーション検証をスティングからオブジェクトに変更しましょう。
<span>{
</span>    <span>"hello": "world"
</span><span>}
</span>
ログイン後にコピー

APIから同じリソースをリクエストすると、次のエラーメッセージが表示されます。

<span>// Demo data
</span><span>let blogs = [
</span>    <span>{
</span>        <span>id: 1,
</span>        <span>title: 'This is an experiment'
</span>    <span>},
</span>    <span>{
</span>        <span>id: 2,
</span>        <span>title: 'Fastify is pretty cool'
</span>    <span>},
</span>    <span>{
</span>        <span>id: 3,
</span>        <span>title: 'Just another blog, yea!'
</span>    <span>}
</span><span>]
</span>
<span>// Handlers
</span><span>const getAllBlogs = async (req<span>, reply</span>) => {
</span>    <span>return blogs
</span><span>}
</span>
<span>const getBlog = async (req<span>, reply</span>) => {
</span>    <span>const id = Number(req.params.id) // blog ID
</span>    <span>const blog = blogs.find(blog => blog.id === id)
</span>    <span>return blog
</span><span>}
</span>
<span>const addBlog = async (req<span>, reply</span>) => {
</span>    <span>const id = blogs.length + 1 // generate new ID
</span>    <span>const newBlog = {
</span>        id<span>,
</span>        <span>title: req.body.title
</span>    <span>}
</span>
    blogs<span>.push(newBlog)
</span>    <span>return newBlog
</span><span>}
</span>
<span>const updateBlog = async (req<span>, reply</span>) => {
</span>    <span>const id = Number(req.params.id)
</span>    blogs <span>= blogs.map(blog => {
</span>        <span>if (blog.id === id) {
</span>            <span>return {
</span>                id<span>,
</span>                <span>title: req.body.title
</span>            <span>}
</span>        <span>}
</span>    <span>})
</span>
    <span>return {
</span>        id<span>,
</span>        <span>title: req.body.title
</span>    <span>}
</span><span>}
</span>
<span>const deleteBlog = async (req<span>, reply</span>) => {
</span>    <span>const id = Number(req.params.id)
</span>
    blogs <span>= blogs.filter(blog => blog.id !== id)
</span>    <span>return { msg: <span>`Blog with ID <span>${id}</span> is deleted`</span> }
</span><span>}
</span>
module<span>.exports = {
</span>    getAllBlogs<span>,
</span>    getBlog<span>,
</span>    addBlog<span>,
</span>    updateBlog<span>,
</span>    deleteBlog
<span>}
</span>
ログイン後にコピー
エラーが見えますか?良い!変更を文字列に戻して、将来のエラーを避け、次のステップに移動しましょう。

ステップ4:ファーストプラグインをロード
<span>mkdir routes
</span><span>cd routes
</span><span>touch blogs.js
</span>
ログイン後にコピー

ここで、Fastifyのリッチプラグインエコシステムを利用しましょう。データベースの統合や承認セットアップなど、さまざまなタスクを使用するのに役立つプラグインを見つけることができます。 Fastifyプラグインを利用できるのに、なぜゼロから承認を書くことに時間を費やすのですか?多くの場合、特定の問題やタスクに役立つFastifyのエコシステム以外のパッケージを探したいと思うことがあります。ただし、リッチなプラグインエコシステムを提供することにより、ファストフィーは開発者エクスペリエンスを確実に改善するワンストップソリューションになります!

<span>const blogController = require('../controller/blogs');
</span>
<span>const routes = [{
</span>        <span>method: 'GET',
</span>        <span>url: '/api/blogs',
</span>        <span>handler: blogController.getAllBlogs
</span>    <span>},
</span>    <span>{
</span>        <span>method: 'GET',
</span>        <span>url: '/api/blogs/:id',
</span>        <span>handler: blogController.getBlog
</span>    <span>},
</span>    <span>{
</span>        <span>method: 'POST',
</span>        <span>url: '/api/blogs',
</span>        <span>handler: blogController.addBlog
</span>    <span>},
</span>    <span>{
</span>        <span>method: 'PUT',
</span>        <span>url: '/api/blogs/:id',
</span>        <span>handler: blogController.updateBlog
</span>    <span>},
</span>    <span>{
</span>        <span>method: 'DELETE',
</span>        <span>url: '/api/blogs/:id',
</span>        <span>handler: blogController.deleteBlog
</span>    <span>}
</span><span>]
</span>module<span>.exports = routes
</span>
ログイン後にコピー
プラグインに関するクイックメモ:機能をカプセル化するために独自のプラグインを作成できます。さらに、それらのプラグインをファストリファストアプリケーションオブジェクトにロードできます。デフォルトでは、Fastifyは最初にFastifyエコシステムからプラグインをロードします。その後、カスタムプラグインがロードされます

わかりました、実用的にしましょう! Fastify-ENVプラグインを使用したいと思います。これは、環境変数の読み込みと各変数のデフォルトの設定に役立ちます。したがって、この依存関係をプロジェクトに追加しましょう

<span>npm init -y
</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
次に、index.jsファイルにFastifyアプリケーションオブジェクトをロードした後、依存関係をロードできます。 index.jsファイルは次のようになります:

<span>npm i fastify --save
</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
Fastify-ENVプラグインに検索するENV変数と設定するデフォルトを指示するオプションオブジェクトを定義する必要があることに注意してください。ここでは、デフォルト値が1000のポート変数をロードしたいと思います。

デフォルトでは、Fustify-ENVプラグインは、so.config.portのようなFustify Appオブジェクトを介してすべての環境変数を使用できるようにします。なぜ? Fastify-ENVプラグインは、ロードされた構成をコンフキーに添付します。ただし、必要に応じて、これを別のキーに変更できます。

ノードindex.jsでプロジェクトを開始し、出力を監視します。端末にポート変数が印刷されていることがわかります。

使用する他の興味深いプラグイン?

Fastify-auth:fustifyで複数のauth関数を実行します

    Fastify-Bearer-auth:fustify fustify
  1. のBearer Authプラグイン
  2. ファーストキャッシュ:一般的なサーバー側のキャッシュとETAGサポート
  3. FASTIFY-CORS:ファーストアプリケーションでCORSを使用できる
  4. ステップ5:フックを定義します
最後に、いくつかのフックを定義しましょう。 Fastify Hooksのドキュメントから、以下を読むことができます。 「フックはFASTIFY.ADDHOOKメソッドに登録されており、アプリケーションまたはリクエスト/応答ライフサイクルで特定のイベントを聴くことができます。イベントがトリガーされる前にフックを登録する必要があります。そうしないと、イベントが失われます。」

ルートを定義する前に、必ずフックを定義してください:

ご覧のとおり、Addhook関数は最初に耳を傾けたいフックを受け入れます。この例では、アプリケーションに登録されている新しいルートを聞きたいと考えています。次に、コールバック関数は、ルートURLやルートメソッドなど、多くの情報を含むルートオプション引数を受け入れます。

<span>touch index.js
</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
Onrouteフックの具体的な詳細は、ドキュメントにあります。

node index.jsでAPIを起動して、どのルートが登録されているかを確認しましょう。端子出力は次のようになります:

同じ出力がありますか?成功!同時に、これがFastifyチュートリアルの終わりでした。このプロジェクトを短い結論でまとめましょう。

ラッピング
<span>// Require the framework and instantiate it
</span><span>const app = require('fastify')({
</span>    <span>logger: true
</span><span>})
</span>
<span>// Declare a route
</span>app<span>.get('/', function (req<span>, reply</span>) {
</span>    reply<span>.send({ hello: 'world' })
</span><span>})
</span>
<span>// Run the server!
</span>app<span>.listen(3000, (err<span>, address</span>) => {
</span>    <span>if (err) {
</span>        app<span>.log.error(err)
</span>        process<span>.exit(1)
</span>    <span>}
</span>    app<span>.log.info(<span>`server listening on <span>${address}</span>`</span>)
</span><span>})
</span>
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

Fastifyは、リッチなプラグインエコシステムを利用できるようにする優れた軽量プロジェクトです。ゼロから機能を作成する代わりに、既存のプラグインを使用できます。言い換えれば、Fastifyは開発者向けのワンストップショップとして機能し、開発者エクスペリエンスを確実に改善します。 個人的には、アプリケーション内のさまざまなライフサイクルイベントを聞くことができるので、Fastify Hooks機能が好きです。

Fustifyの詳細については、次のドキュメントページをご覧ください。

    カスタムプラグインを作成する方法?
  • タイプスクリプトサポートを追加する方法?
  • corsなどのミドルウェアの使用方法
この紹介については、Githubでこの紹介のレポをチェックすることもできます。

fustifyを使用したREST APIの作成に関するよくある質問(FAQ)

FASTIFYを使用してREST APIを作成するための前提条件は何ですか?

node.jsパッケージマネージャーであるNPMを使用してFustifyをインストールできます。端末を開き、次のコマンドを実行します。NPMインストールFastify。これにより、現在のプロジェクトディレクトリにFustifyがインストールされます。コマンドを実行する前に、正しいディレクトリにいることを確認してください。

Fustifyを備えたサーバーを作成するにはどうすればよいですか?あなたのアプリケーション。次に、新しいFastifyインスタンスを作成できます。基本的な例は次のとおりです。

const fastify = require( 'fatify')({logger:true})

fustify.listen(3000、(err、address)=> {

if(err)throw err

fustify.log.info( `サーバーを$ {address}`)

})


> fustify?
​​ Fustifyでは、ルートメソッドを使用してルートを定義します。この方法は、オブジェクトを引数として受け取り、ルートのプロパティを定義します。例は次のとおりです。

fustify.route({
メソッド: 'get'、
url: '/'、
ハンドラー:function(request、neply){

返信.send({hello: 'world'})

}

})


Fastifyのエラーを処理するにはどうすればよいですか? Reply Objectのコードを使用して、メソッドを送信してエラー応答を送信できます。例は次のとおりです。

fustify.get( '/error'、function(request、reply){
reply.code(500).send(new error( 'internal server error'))
})

ファースト化でプラグインを使用するにはどうすればよいですか?
​​

ファストフィーには、機能を拡張できる強力なプラグインアーキテクチャがあります。レジスタメソッドを使用して、プラグインを登録できます。例は次のとおりです。

fustify.register(require( 'fatify-cors')、{

origin:true
})

Fastifyでリクエストを検証するにはどうすればよいですか?

Fastifyは、Fustify-schemaと呼ばれる組み込みの検証およびシリアル化ライブラリを提供します。このライブラリを使用して、着信要求を検証し、発信応答をシリアル化できます。例は次のとおりです。

fustify.route({
method: 'post'、
url: '/validate'、
schema:{
body:{
>タイプ: 'object'、
必須:['name'、 'email']、
Properties:{
name:{type: 'string'}、
email:{type: 'string '}
}
}
}、
Handler:function(request、Reply){Reply.send({hello:' world '})
}
} )

ファースト化アプリケーションをテストするにはどうすればよいですか?

Fustifyは、テスト目的のためのHTTP要求と応答をシミュレートできるようにする注入方法を提供します。例は次のとおりです。

fustify.inject({
メソッド: 'get'、
url: '/'、
}、(err、response)=> {
} console.log(response.payload)
})

ファーストリファイアプリケーションを展開するにはどうすればよいですか?

他のnode.jsアプリケーションと同様に、ファーストアプリケーションを展開できます。 Heroku、AWS、Google Cloudプラットフォームなどのプラットフォームを使用できます。アプリケーションを展開するときに、Node_Env環境変数を生産に設定してください。ルートハンドラーのAsync/Awaitの構文を使用して、より読みやすい方法で非同期コードを作成できます。例は次のとおりです。

fustify.get( '/async'、async function(request、require){

const result = await someasyncoperation()

return result
})

以上がFustifyを使用して最初のREST APIを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート