首頁 > web前端 > js教程 > 如何使用快速創建第一個REST API

如何使用快速創建第一個REST API

尊渡假赌尊渡假赌尊渡假赌
發布: 2025-02-10 13:00:41
原創
673 人瀏覽過

如何使用快速創建第一個REST API

鑰匙要點

  • fastify提供了一個輕巧且快速的替代方案,用於構建REST API,優於其他Node.js框架,例如Express和Hapi。
  • >設置快速API涉及簡單的步驟,例如初始化項目,安裝快速化以及創建基本服務器和路由設置。
  • > Fastify的強大插件生態系統允許輕鬆整合和擴展功能,增強開發人員的體驗而無需重新發明輪子。
  • 添加fastify中的模式驗證確保API請求和響應符合預定義的格式,從而提高了可靠性和錯誤處理。
  • >
  • >利用Fastify的鉤子允許開發人員攔截各種生命週期事件,從而對應用程序流和行為提供更大的控制。
  • Fastify是一個專為後端Web開發設計的框架。它為較重的Node.js API框架(例如Hapi and Express)提供了更輕巧的替代品。從2020年7月開始,Fastify發布了其第三版的框架。
  • >
>作為請求參數,該第三版具有改進的驗證能力,以驗證傳入和發出請求。此外,與KOA,RESITFY,HAPI和Express相比,該框架的第三版將其吞吐量索賠合併為最快的節點。更多信息可以在“基準”頁面上找到。

由於其輕巧的設計,Fastify

已獲得了很多知名度。但是,其插件生態系統很多關注。 Fastify採用了所有內容都是插件的想法,而使用JavaScript,一切都是對象。這使您可以快速將項目的功能作為插件封裝並進行分發,以便其他項目可以使用您的代碼。 >

>讓我們從本教程開始。您將學習fastify的以下方面:

如何設置第一個快速api

如何定義快速API路由
  • >如何將架構驗證添加到請求
  • >
  • >如何加載和使用快速插件
  • 如何定義快速鉤
  • 要求和安裝
  • 要遵循本教程,您需要:

最新的node.js版本

>發送請求的工具,例如捲髮或郵遞員
  1. 接下來,請確保創建一個空Node.js項目。如果您還沒有一個,則可以使用以下命令來設置您的項目:
  2. >最後,我們想將此快速依賴性添加到我們的項目中:>
都很好嗎?讓我們在下一步中創建基本的API設置。

步驟1:基本API設置
<span>npm init -y
</span>
登入後複製
登入後複製
登入後複製
登入後複製

首先,讓我們創建基本的API設置。為了開始,我們需要在我們的項目root中創建一個名為index.js的新文件:>

接下來,讓我們添加基本服務器設置。複製下面的代碼:
<span>npm i fastify --save
</span>
登入後複製
登入後複製
登入後複製
登入後複製
<span>npm init -y
</span>
登入後複製
登入後複製
登入後複製
登入後複製

>這裡發生了幾件事。我們首先加載快速應用程序對象並啟用記錄。接下來,我們聲明了一條以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/:id
  • >獲取一個博客
  • 發佈在 /api /Blogs
  • 上添加博客
  • 在/api/blogs/:id
  • >上放置更新博客
  • >刪除刪除博客at/api/blogs/:id
  • >
首先要做的就是創建一個博客控制器。

>步驟2.1:創建博客控制器

為了保持代碼清潔,讓我們在項目根中定義一個控制器文件夾。在這裡,我們創建一個名為blogs.js的文件。

此文件包含一些演示數據,以避免使用數據庫集成使本教程複雜化。因此,我們使用一個包含每個包含ID和標題字段的博客對象的數組。

此外,我們為該文件中的所有路由定義了不同的處理程序。處理程序始終接受req(請求)並回复參數。請求參數對於訪問請求參數或請求正文數據很有用。

>

>將以下代碼添加到您的 /controller /blogs.js文件:>

>請注意,我們如何訪問/api/blogs/:ID的路由的請求參數:via req.params.id。對於發布和放置路線,我們可以通過req.body訪問請求的正文。

在步驟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>
登入後複製
登入後複製
登入後複製
>步驟2.2:定義博客路線和情侶博客控制器

再次,要保持代碼清潔,讓我們在項目根中定義一個路由文件夾。在這裡,我們創建一個名為blogs.js的文件。該文件保留我們博客路由的路由對象:

幸運的是,Fastify允許我們定義一個包含路由對象的數組。在這裡,我們可以將以前定義的處理程序搭配到不同的路線。不要忘記需要博客控制器。讓我們看看:

>現在我們已經定義了所有路線。但是,快速不知道這些路線。下一步顯示瞭如何使用快速應用程序對象註冊路由。

>

>步驟2.3:註冊快速路由
<span>node index.js
</span>
登入後複製
登入後複製
在此步驟中,我們將將快速路由註冊到應用程序對象。首先,我們加載了所有博客路線。接下來,我們在所有路線上循環以一一註冊它們:

>

<span>npm init -y
</span>
登入後複製
登入後複製
登入後複製
登入後複製

完成?是時候驗證博客路線是否有效了。使用節點索引旋轉服務器,然後訪問http:// localhost:3000/blogs/1,從演示數據中獲取第一個博客。您應該看到以下結果:

<span>npm i fastify --save
</span>
登入後複製
登入後複製
登入後複製
登入後複製

都很好嗎?讓我們在第3步中了解如何將架構驗證添加到請求和響應中。

>

步驟3:添加架構驗證

>此步驟會教您如何在項目中添加模式驗證。我們可以在路線定義中使用架構密鑰,以將驗證模式傳遞到特定路線。

>讓我們從定義路由/api/blogs/:id的架構開始,以驗證請求參數和響應。要求?

    :ID參數必須為類型字符串
  1. 響應必須包含一個具有兩個屬性ID(Integer)和title(string) >將以下驗證對象添加到您的路由/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>
登入後複製
登入後複製
登入後複製
接下來,我們必須再次將驗證對象連接到正確的路由:>

要驗證我們的驗證,讓我們用ID 3檢索博客。在http:// localhost:3000/api/blogs/3上打開瀏覽器。您應該看到以下響應:
<span>node index.js
</span>
登入後複製
登入後複製

現在,讓我們犯一個錯誤,然後更改ID字段的參數驗證從sting到objoct:
<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>
登入後複製
>

您看到錯誤了嗎?好的!讓我們將更改恢復為字符串,以避免將來的錯誤並轉到下一步。 >
<span>mkdir routes
</span><span>cd routes
</span><span>touch blogs.js
</span>
登入後複製
>步驟4:加載快速插件

>在這裡,讓我們利用Fastify富插件生態系統。您可以找到可以幫助您完成各種任務的插件,例如數據庫集成或授權設置。為什麼您可以花時間從頭開始寫授權,同時可以使用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>
登入後複製
登入後複製
登入後複製
登入後複製
接下來,在將fastify應用程序對象加載到index.js文件中後,我們可以加載依賴項。您的index.js文件看起來像這樣:

<span>npm i fastify --save
</span>
登入後複製
登入後複製
登入後複製
登入後複製
請注意,我們必須定義一個選項對象,該對象告訴fastify-env插件要查找哪些env變量以及要設置哪些默認值。在這裡,我想加載一個默認值為1000的端口變量。 >

默認情況下,Fastify-env插件將通過so:app.config.port之類的fastify應用對象提供所有環境變量。為什麼? Fastify-env插件將加載的配置附加到Confkey,默認情況下將其設置為配置。但是,如果您願意,可以將其更改為另一個鍵。

>

>使用節點index.js啟動項目並監視輸出。您應該看到端口變量在終端中打印。

其他有趣的插件?

>

fastify-auth:在fastify
    中運行多個auth函數
  1. fastify-bearer-auth:fastify
  2. > bearer auth插件
  3. fastify-caching:一般服務器端緩存和ETAG支持
  4. fastify-cors:啟用在快速應用程序中使用CORS
  5. 步驟5:定義掛鉤
最後,讓我們定義一些鉤子。從快速掛鉤文檔中,我們可以閱讀以下內容。 “掛鉤已註冊為fastify.addhook方法,並允許您在應用程序或請求/響應生命週期中收聽特定事件。您必須在觸發事件之前註冊鉤子,否則事件丟失。

>在定義任何路線之前,請確保定義掛鉤:>

如您所見,Addhook函數首先接受您要收聽的鉤子。在我們的示例中,我們想收聽正在應用程序註冊的新路線。接下來,回調函數接受RouteOptions參數,其中包含大量信息,例如路由URL或路由方法。

在文檔中可以找到有關OnRoute Hook的特定細節。

>

>讓我們使用節點索引。 JS啟動API,以查看已註冊的路由。您的終端輸出應該看起來像這樣:

<span>touch index.js
</span>
登入後複製
登入後複製
登入後複製

獲得相同的輸出?成功!同時,這是Fastify教程的結尾。讓我們以簡短的結論來結束這個項目。

總結

Fastify是一個很棒的輕巧項目,可讓您使用其富插件生態系統。您可以使用現有插件,而不是從頭開始創建功能。換句話說,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的更多信息,請查看以下文檔頁面:>

    如何創建自定義插件?
  • >
  • 如何添加打字稿支持?
  • >
  • >如何使用中間件(例如CORS)?
>您也可以在GitHub上查看此介紹的回購。

>

常見問題(常見問題解答)關於使用Fastify

創建REST API

>在開始使用Fastify創建REST API之前,創建使用Fastify的REST API的先決條件是什麼,您需要對JavaScript和Node.js有基本的了解。您還應該在計算機上安裝NODE.JS和NPM。 node.js是一個JavaScript運行時,允許您在服務器上運行JavaScript,而NPM是Node.js的軟件包管理器,允許您安裝和管理項目依賴的軟件包。安裝fastify?

>您可以使用node.js package manager npm安裝快速安裝。打開終端並運行以下命令:NPM安裝fastify。這將在您當前的項目目錄中安裝快速。在運行命令之前,請確保您在正確的目錄中。

如何使用快速fastify創建服務器?

以使用快速fastify創建服務器,您首先需要在您的申請。然後,您可以創建一個新的快速實例。這是一個基本示例:

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

fastify.listen(3000,(err,errive,address)=> { 如果(err)投擲err
fastify.log.info(`'服務器在$ {address}`)
})
>
>
>中如何在fastify中定義路由? >在Fastify中,您使用路由方法定義路由。該方法將對像作為參數,該參數定義了路由的屬性。這是一個示例:

fastify.route({

>方法:'get',

url:'/',
> handler:function(request,reply,reply) 。您可以使用回復對象的代碼並發送方法發送錯誤響應。這是一個示例:

fastify.get('/error',function(request,reploy){
reploy.code(500) .send(new error(new Irror('內部服務器錯誤')))
})

>如何在Fastify中使用插件?

fastify具有功能強大的插件體系結構,可允許您擴展其功能。您可以使用寄存器方法來註冊插件。這是一個示例:

fastify.register(require('fastify-cors'),{

> origin:true
})
>

>我如何驗證fastify中的請求?

fastify提供了一個內置驗證和序列化庫,稱為fastify-schema。您可以使用此庫來驗證傳入請求并序列化響應。這是一個示例:

fastify.route({
>方法:'post',
> url:'/validate',
schema:{
body:{
類型:'object',
必需:['name','email'],
屬性:{
name:{type:'string'},
電子郵件:{type :type:'string string '}
}
}
}, reploy.send({hello:hello:'world'})
}
} )

>如何測試我的快速應用程序?

fastify提供了一種注入方法,該方法允許您模擬HTTP請求和響應以進行測試。這是一個示例:

fastify.Inject({
>方法:'get',
> url:'/',
},(err,response)=> {})

>如何部署我的fastify應用程序?

您可以像任何其他node.js應用程序一樣部署fastify應用程序。您可以使用Heroku,AWS或Google Cloud平台等平台。在部署應用程序時,請確保將NODE_ENV環境變量設置為生產。

>如何在Fastify中處理異步代碼?

fastify支持回調和處理異步代碼的承諾。您可以在路由處理程序中使用異步/等待語法以更可讀性的方式編寫異步代碼。這是一個示例:

fastify.get('/async',async函數(請求,回复){ const result =等待someasyncoperation() >

以上是如何使用快速創建第一個REST API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板