如何使用Fastify构建快速的API

https://www.fastify.io/

Fastify是用于后端Web开发的框架,具有强大的插件架构和最少的开销。它的主要灵感来自HapiExpress,并且是运行在Node.js上的最快的Web框架之一。

Fastify v3.0是最新版本,自2020年7月上旬开始可用。v3.0具有一些特殊的新功能,例如:

  • 在Fastify中运行Express应用程序
  • 日志序列化中的更改
  • 模式替换的更改
  • 更好的TypeScript支持

Fastify功能概述

现在我们已经介绍了Fastify的最新版本更新功能,让我们来回顾一下Fastify最重要的功能。

  • 高性能:根据代码的复杂程度,它可以为不太复杂的业务逻辑提供每秒约30,000个请求或更多的服务。

  • 可扩展性:Hooks、插件和装饰器使其具有完全的可扩展性。

  • 基于Scheme:在内部,Fastify将JSON模式编译成一个高性能的函数,可用于路由验证和输出序列化。

  • LoggingPino是一种经济高效的记录器,可用于更快地记录日志

  • 开发人员友好的环境:框架表现力强,容易上手。此外,它允许开发人员在不牺牲性能或安全性的情况下,将小型项目快速扩展到更大的高性能应用程序。

  • 支持TypeScript:TypeScript类型声明文件维护了对TypeScript社区的支持

你应该知道的5个重要的Fastify插件

除了提供大量的功能外,它还有一个强大的插件架构。任何开发人员都可以构建与Fastify一起工作的插件,为API项目创建快速的构建块。

由外部开发人员开发的插件属于“社区插件”的范畴,而Fastify团队也维护着他们自己的一些插件,他们称之为“核心插件”。然而,重要的是要知道,任何社区插件都必须遵守Fastify的最佳实践。

使用核心插件的好处是,Fastify团队会积极维护这些插件,但请记住,社区插件可能不会被维护。

这里有一些重要的Fastify插件需要注意:

  • fastify-auth:Fastify团队开发的身份验证插件,可让你快速向API路由注入身份验证逻辑。
  • fastify-cors:跨源请求对任何应用程序都很重要,fastify-cors可以帮助你管理这些请求,而不需要单独安装CORS包。
  • fastify-jwt:这个插件将用标准的JSON web token来装饰你的应用程序。Fastify-jwt内部使用jsonwebtoken包。
  • fastify-nextjs:Next是一个React框架,用于在服务器端构建预渲染网站。这个插件可以帮助你用Fastify做同样的事情。
  • fastify-redis:这使你的Fastify应用程序能够在整个服务器上共享同一个Redis连接。

而这还不是一个全面的列表,Fastify有一个广泛的插件选择。

Fastify vs Koa vs Express

当然,每个框架都有其优点和缺点——但每个框架也有其应用场景。要比较不同的框架并不容易,然而,我试图选择相关的评估标准供你在选择框架时参考。

速度比较

下面是StackShare.io对速度对比的概述。

  • Express:Express处理的请求量最少/秒。基准证明,Express可以处理15978个请求/秒。

  • Koa:Koa是比Express更好的选择。它也是一个轻量级框架,可以处理54,848个请求/秒。

  • Fastify:Fastify获得了最佳的基准结果,78,956次/秒的请求量。

插件生态系统

正如上一节所讨论的,Fastify是这三个框架中唯一一个拥有多种插件的Web框架,而且它有很大的不同。这对开发者来说是一个很大的好处,因为他们不必依赖多个框架或包来构建他们的应用程序。Fastify成为一站式的解决方案。

TypeScript支持

同样,Fastify是唯一一个开箱即支持TypeScript的框架。根据你的Node.js版本,你可能需要安装 @types/node

使用Fastify 3.0创建你的第一个服务器

现在,激动人心的部分来了!本教程将指导你如何使用Fastify建立你的第一个服务器,包括以下几个方面:

  1. 安装
  2. 运行你的第一台服务器
  3. 添加路由到你的API
  4. 使用Fastify插件
  5. 增加数据验证功能

准备好了吗?让我们开始。

1.安装及要求

首先,使用以下命令启动一个新的npm项目:

npm init -y

接下来,让我们将Fastify依赖项添加到你的项目中。

npm i fastify --save
// OR
yarn add fastify

确保在系统上安装了最新的Node.js版本。你可以使用nvm(Node版本管理器)来快速切换不同的Node.js版本。你还需要一个工具来发送请求,比如cURL或Postman。

2.创建server.js

接下来,让我们在项目的根目录下创建一个名为 server.js 的新文件。在你的 server.js 文件中添加以下代码。

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

// 在此处添加路由,将在后续步骤中进行讨论

//@Server
fastify.listen(5000, (err) => {
  if (err) {
    console.log(err)
    process.exit(1)
  } else {
    console.log(`Server running, navigate to  https://localhost:5000`)
  }
})

如你所见,监听函数在端口 5000 上启动服务器。它还接受一个回调,该回调接受一个参数,该参数可以包含一个错误对象。这是运行Fastify API的最基本的服务器设置。

如果要尝试此基本设置,可以使用 node 命令运行 server.js 文件,如下所示:

node server.js

这将在地址http://localhost:5000上启动服务器。如果你尝试导航到这个地址,你会看到一个错误,这个路由不存在,因为我们还没有定义任何路由。现在我们需要添加一些简单的CRUD路由。

3.添加CRUD路由

让我们向应用程序中添加一些基本的CRUD路由。首先,让我们添加一个GET路由。

3.1 GET路由

假设我们有一个数组类型的 stack对象。首先,我们想要添加一个GET路由来检索这个数组的内容。要做到这一点,我们可以使用Fastify对象来定义一个 get 路由。第一个参数接受我们要附加路由的路径,第二个参数接受回调,回调会给你的客户端发送回复。

const stack = []

//@Routes
fastify.get('/getStack', (request, reply) => {
  reply.send(stack)
})

3.2 POST路由

接下来,让我们尝试使用POST路由向我们的stack数组添加项目。这样一来,我们就可以通过请求来发送数据。在这里,我们希望用户发送带有一个名为 item 的参数的JSON对象。我们把这个项目push到我们的stack数组中。现在我们可以使用回调 request 的第一个参数,它包含了POST请求发送的数据。

fastify.post('/addItem', (request, reply) => {
  const item = request.body.item
  stack.push(item)
  reply.send(stack)
})

同样的原则也适用于其他路由方法,如PUT、DELETE、HEAD、PATCH和OPTIONS。关于路由选项的更多信息可以在Fastify文档中找到。

3.3 最终路由代码

你的最终路由代码应如下所示:

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

const stack = []

//@Routes
fastify.get('/getStack', (request, reply) => {
  reply.send(stack)
})

fastify.post('/addItem', (request, reply) => {
    const item = request.body.item
    stack.push(item)
    reply.send(stack)
})

//@Server
fastify.listen(5000, (err) => {
  if (err) {
    console.log(err)
    process.exit(1)
  } else {
    console.log(`Server running, navigate to  https://localhost:5000`)
  }
})

现在让我们试试我们创建的代码。首先,用 node server.js 启动服务器。接下来,访问下面的路由http://localhost:5000/getStack,它应该返回一个空数组对象。

让我们使用cURL向stack中添加一个项目。我想在stack中添加一个 apple。因此,我发送了一个包含key item和value apple的JSON对象。

curl --header "Content-Type: application/json" --request POST --data '{"item": "apple"}' http://localhost:5000/addItem

如果你再次访问http://localhost:5000/getStack,你会发现stack数组中已经填充了 apple 项目。

都好吗?那就加个插件吧!

4.将插件添加到Fastify API

为了演示添加和使用Fastify插件是多么简单,让我们安装fastify-routes,它使我们能够检索所有注册的Fastify实例的路由地图。

首先,从CLI安装Fastify-routes依赖项:

npm i fastify-routes

安装插件后,请在注册任何路由之前通过包含插件来注册插件。

这是 server.js 文件的一个片段,其中包含 fastify-routes 插件。我还添加了 console.log 语句,该语句显示了如何使用该插件返回所有已注册的路由。

const fastify = require('fastify')({ logger: true })
fastify.register(require('fastify-routes')) // Add and register plugin

const stack = []

//@Routes
fastify.get('/getStack', (request, reply) => {
    reply.send(stack)
})

fastify.post('/addItem', (request, reply) => {
    const item = request.body.item
    stack.push(item)
    reply.send(stack)
})

//@Server
fastify.listen(5000, (err) => {
    console.log(fastify.routes) // Log all registered routes
    if (err) {
        console.log(err)
        process.exit(1)
    } else {
        console.log(`Server running, navigate to  https://localhost:5000`)
    }
})

现在,当你使用 node server.js 启动服务器时,CLI将打印所有已注册的路由。组成你的服务器的 fastify 对象也作为所有注册插件的父对象,你可以直接从这个 fastify 对象中调用它们。

最后,让我们在服务器上添加一些基本的数据验证。

5.添加数据验证

作为本教程的最后一个元素,我们将数据验证添加到你的路由中。具体来说,我们要为我们之前创建的POST路由添加验证。让我们验证一下body对象是否包含 item 属性,数据类型是否应该匹配字符串类型。

幸运的是,Fastify允许我们为路由定义验证模式。下面是一个验证 item 属性是否存在并包含字符串的例子。此外,我们使用 extraitionalProperties: false 设置告诉Fastify服务器,我们不允许在body对象上有任何附加属性。

你还可以定义一个response属性,该属性描述请求成功时的响应。

这是添加数据验证选项后的完整代码。不要忘了将 itemValidation 添加为POST路由的第二个参数。

const fastify = require('fastify')({ logger: true })
fastify.register(require('fastify-routes'))

const itemValidation = { // Define validation
    schema: {
        body: {
            type: 'object',
            additionalProperties: false,
            required: [
                'item'
            ],
            properties: {
                item: { type: 'string' }
            }
        },
        response: {
            201: {
                type: 'object',
                properties: {
                    item: { type: 'string' }
                }
            }
        }
    }
}

const stack = []

//@Routes
fastify.get('/getStack', (request, reply) => {
    reply.send(stack)
})

fastify.post('/addItem', itemValidation, (request, reply) => { // Add validation options to POST route
    const item = request.body.item
    stack.push(item)
    reply.send(stack)
})

//@Server
fastify.listen(5000, (err) => {
    console.log(fastify.routes)
    if (err) {
        console.log(err)
        process.exit(1)
    } else {
        console.log(`Server running, navigate to  https://localhost:5000`)
    }
})

让我们通过将相同的请求发送到我们的服务器,再添加 apple 项目,再次尝试代码。该请求应成功执行。

curl --header "Content-Type: application/json" --request POST --data '{"item": "apple"}' http://localhost:5000/addItem

接下来,让我们尝试发送一个包含空对象的项目,以便我们可以测试服务器是否拒绝了该请求。向你的服务器发送以下请求,以验证数据验证的实现。

curl --header "Content-Type: application/json" --request POST --data '{"item": {}}' http://localhost:5000/addItem

服务器应向你发送以下错误消息:

{"statusCode":400,"error":"Bad Request","message":"body.item should be string"}

都好吗?恭喜你!你已经成功完成了第一台Fastify API服务器。

结束

我希望你喜欢使用Fastify构建一个简单的CRUD API,同时实现数据验证和添加插件。

还有更多的插件存在,所以一定要查看Fastify插件生态系统,看看有哪些可用的插件。插件对于快速引导你的API很有用,无需从头开始构建API。

随时查看Fastify提供的以下概念:

  • 数据序列化
  • 如何在服务器上使用HTTP2
  • 添加hooks以监听服务器中的特定事件
  • 需要自定义中间件吗?只需添加它!

就是这样,伙计们!完整的代码可以在我的GitHub仓库中找到。

最后

最近整理了一份优质视频教程资源,想要的可以关注我公众号:前端全栈开发者,即可免费领取哦!如果文章对你有所启发和帮助,可以点个关注、收藏、转发,也可以留言讨论,这是对作者的最大鼓励。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值