由於其輕巧的設計,Fastify
已獲得了很多知名度。但是,其插件生態系統很多關注。 Fastify採用了所有內容都是插件的想法,而使用JavaScript,一切都是對象。這使您可以快速將項目的功能作為插件封裝並進行分發,以便其他項目可以使用您的代碼。>讓我們從本教程開始。您將學習fastify的以下方面:
如何設置第一個快速api
如何定義快速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>
<span>touch index.js </span>
步驟2:定義CRUD路線
>步驟2.1:創建博客控制器
此文件包含一些演示數據,以避免使用數據庫集成使本教程複雜化。因此,我們使用一個包含每個包含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>
再次,要保持代碼清潔,讓我們在項目根中定義一個路由文件夾。在這裡,我們創建一個名為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步中了解如何將架構驗證添加到請求和響應中。
>>此步驟會教您如何在項目中添加模式驗證。我們可以在路線定義中使用架構密鑰,以將驗證模式傳遞到特定路線。
>讓我們從定義路由/api/blogs/:id的架構開始,以驗證請求參數和響應。要求?
要將驗證對象連接到我們的路由,我們必須定義架構鍵。在路線數組中查找/api/blogs/:ID路線,並相應地更改對象:
<span>touch index.js </span>
<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>
>在這裡,讓我們利用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>
<span>npm i fastify --save </span>
默認情況下,Fastify-env插件將通過so:app.config.port之類的fastify應用對象提供所有環境變量。為什麼? Fastify-env插件將加載的配置附加到Confkey,默認情況下將其設置為配置。但是,如果您願意,可以將其更改為另一個鍵。
>>使用節點index.js啟動項目並監視輸出。您應該看到端口變量在終端中打印。
其他有趣的插件?
>fastify-auth:在fastify
在文檔中可以找到有關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的更多信息,請查看以下文檔頁面:
>
常見問題(常見問題解答)關於使用Fastify const fastify = require('fastify')({logger:true})
fastify.listen(3000,(err,errive,address)=> { 如果(err)投擲err
fastify.log.info(`'服務器在$ {address}`)
})
>
>
>中如何在fastify中定義路由? >在Fastify中,您使用路由方法定義路由。該方法將對像作為參數,該參數定義了路由的屬性。這是一個示例:
url:'/',
> handler:function(request,reply,reply) 。您可以使用回復對象的代碼並發送方法發送錯誤響應。這是一個示例:
fastify.get('/error',function(request,reploy){
reploy.code(500) .send(new error(new Irror('內部服務器錯誤')))
})
>如何在Fastify中使用插件?
> origin:true
})
>
fastify提供了一個內置驗證和序列化庫,稱為fastify-schema。您可以使用此庫來驗證傳入請求并序列化響應。這是一個示例:
fastify.route({
>方法:'post',
> url:'/validate',
schema:{
body:{
類型:'object',
必需:['name','email'],
屬性:{
name:{type:'string'},
電子郵件:{type :type:'string string '}
}
}
},
}
} )
fastify.Inject({
>方法:'get',
> url:'/',
},(err,response)=> {})
>如何部署我的fastify應用程序?
以上是如何使用快速創建第一個REST API的詳細內容。更多資訊請關注PHP中文網其他相關文章!