首页 > web前端 > js教程 > 如何使用快速创建第一个REST API

如何使用快速创建第一个REST API

尊渡假赌尊渡假赌尊渡假赌
发布: 2025-02-10 13:00:41
原创
674 人浏览过

如何使用快速创建第一个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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板